On 9 déc, 14:10, Eric Chamberlain <e...@rf.com> wrote: > Hello, > > We're not sure how can we represent the following data structure in the > django model? > > Grandparent Object > First Name - NULL > Last Name - NULL > City - Anytown > Ancestor Object - NULL > > Parent Object > First Name - Bob > Last Name - Smith > City - NULL > Ancestor Object - Grandparent > > Child Object > First Name - Jill > Last Name - NULL > City - NULL > Ancestor Object - Parent
Took me some times to understand this was about model instances, not classes :-/ First point, you have a tree structure. There are a couple ways to handle trees in a relational model, each has pros and cons. The most obvious one is the recursive relationship (also known as 'adjacency list'): create table Person( id integer primary key auto increment, first_name varchar(50) NULL, last_name varchar(50) NULL, city varchar(50) NULL, ancestor_id integer NULL ) where ancestor_id refers to the Person.id of the 'ancestor'. The problem with this solution is that SQL has no way to let you retrieve a whole 'branch' in one single query. Other solutions I wont explain here are the "Materialized Path" and the "Modified Preorder Tree Traversal" (mptt). You'll find more on this topic here: http://articles.sitepoint.com/print/hierarchical-data-database These solutions are somewhat more complex, but allow to fetch a whole branch in a single query. OTHO, they usually imply way more work when modifying the tree, so there's no "absolutely better" solution - which one will yield the best results depends on your application's needs and tree depth. > We'd like to be able to use the child object with the NULL fields coming from > the ancestor objects. I assume that what you mean is you want to lookup values on the related 'parent' object for fields that have a NULL value in the 'child' object. The usual way to handle this in Python is to use computed attributes. > We need to update the parent field and have all the child objects return the > new value. The parent object behaves like a template, some users have write > access to the child, but not the parent object or some users may not have > write access to all the child fields. Hmmm... sorry but this part isn't quite clear to me. Care to provide a bit more (or clearer) explanations ? (sorry for being that dumb). > We'd like to keep database calls to a minimum and avoid looping lookups if > possible. Then you want a materialized path or MPTT. > Is there a better way to implement this? "better" than what ??? You didn't say anything about your implementation ? -- You received this message because you are subscribed to the Google Groups "Django users" group. To post to this group, send email to django-us...@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.