On May 23, 3:06 pm, sk <6b656...@gmail.com> wrote: > > On May 22, 12:51 pm, sk <6b656...@gmail.com> wrote: > > > > If I have a hierarchy of models such that: > > > > class A(models.Model): > > > name = CharField(max_length=10) > > > > class B(models.Model): > > > name = CharField(max_length=10) > > > a= ForeignKey(A) > > > > class C(models.Model): > > > name = CharField(max_length=10) > > > b= ForeignKey(B) > > > > If I have an instance of C, as returned by: > > > > c = C.objects.get(pk=1) > > > > How do I get the name of A? > > > > I realise I can go via B, but I am hoping to be able to follow the > > > chain back to A from any arbitrary point in (a much longer) chain. > > > > For example: > > > If this was repeated up to F in an identical manner. > > > If I pass a function any instance from A to F I would want to return > > > A.name. > > > > I am sure there must be a simple way to get the root data, but I am > > > having trouble finding it. > > > You really do have to go through the relations through the chain - > > there is no direct links from C to A so it is impossible to just hop > > from C to A. > > > You can query the A instance by something like > > A.objects.filter(pk=B.objects.filter(pk=c.b_id)) - this should return > > the A instance in one query. (It might be you will need to use > > pk__in). > > > Or, you could use select_related or prefetch_related to do the > > fetching. > > > - Anssi- Hide quoted text - > > > - Show quoted text - > > Fair enough, thank you for your reply. > > I is it posible to 'follow the chain' without knowing the exact > instance you are in? for example can i get all foreign keys for a > given instance, then follow them? To be honest this is just for > interest now - I have implemented this with some hard-coding of how to > decide where you are in the 'tree'.
You can check Model._meta.fields, Model._meta.get_field_by_name() etc. Do a dir(ModelClass._meta) in pdb and you should see what methods/ attributes are available. The ._meta is part of the private API, so there are no stability guarantees... The ._meta is what Django's ORM uses when checking what lookups are available, and which of them are foreign keys, reverse foreign keys etc. So, it should contain all the necessary information for you. - Anssi -- 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.