Daniel and Matthias Thanks for your help. I finally figured out I don't need any automatic Django n:m at all! I just made my own n:m table and everything works the way I expect. I'll really try to keep things simple from now on ...
Cheers Mike Mike Dewhirst wrote: > Matthias Kestenholz wrote: > > <snip> > >> Is this your complete Membership model? Or do you have additional >> fields there? If you've only got these two foreign keys, it might be >> better to use a many to many field that references the same model ( >> ManyToManyField('self') ) > > Thanks Matthias - exactly what I wanted - see below. It isn't the > complete system but I'm just starting and want to get the beginnings > more or less correctly working. > >> Plus, you should use unicode(), not str() inside __unicode__ -- str() >> will bail if client_type or surname contains non-ASCII-chars. > > Thanks again ... > > Daniel Roseman wrote: >> On Jul 24, 5:46 am, Mike Dewhirst <mi...@dewhirst.com.au> wrote: >>> I'm new to Django and want to express a self-referencing design >>> feature to link clients in the same table with each other. > > <snip> > >> You don't say what the error is. I can guess, though, and as always >> the clue is in the error message (why do people never seem to read >> these?) > > Thanks also Daniel. You are right of course - my apologies. I did read > the message but did not have the brainspace to understand it at the > time. Even now I'm relying on assumptions which I hope will become clear > one day. Which leads me to another question about Django orm ... > > Does Django need to create all the tables itself? I have been dropping > everything and re-syncdb-ing to try and make things happen. Can I make > my own tables and ask Django to use them? > > My new models.py is as you and Matthias advised ... > - - - - - - - - > from django.db import models > > class Client(models.Model): > """ base class for everyone/thing """ > surname = models.CharField(max_length=48, blank=False) > client_type = models.CharField(max_length=24, blank=True) > group = models.ManyToManyField('self', > #db_table='foo_membership', > blank=True) > > def __unicode__(self): > return u'%s : %s' % (self.client_type, self.surname) > > class Membership(models.Model): > """ cross (xr) referencing and linking clients """ > client_x = models.ForeignKey(Client, related_name='x_set') > client_r = models.ForeignKey(Client, related_name='r_set') > description = models.CharField(max_length=48, blank=False) > > def __unicode__(self): > return u'Linked: %s - %s' % (unicode(self.client_x), > unicode(self.client_r)) > - - - - - - - - > > If I reverse the position of the above two classes prior to syncdb, > Django quite reasonably complains that Client (in Membership) does not > exist. If I leave them in the above sequence it invents its own > foo_client_group table for the n:m table and then creates my Membership > table too. > > I have tried using db_table='foo_membership' but that causes ... > > File "C:\usr\bin\lib\site-packages\django\db\backends\util.py", line > 19, in execute > return self.cursor.execute(sql, params) > psycopg2.ProgrammingError: relation "foo_membership" already exists > > I could cope with omitting my Membership table and adding a > 'description' column to Django's 'foo_client_group' table - but then how > do I make a class which knows about the foo_client_group table name? > > > Is there a trick to it or have I (more likely) missed something obvious? > > Sorry to be so opaque. I'm just getting over a month of late nights. > > Thanks > > Mike > > <snip> > > > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Django users" group. To post to this group, send email to django-users@googlegroups.com To unsubscribe from this group, send email to django-users+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/django-users?hl=en -~----------~----~----~----~------~----~------~--~---