On May 5, 9:15 pm, Daniel Roseman <dan...@roseman.org.uk> wrote:
> On May 5, 6:27 pm, Derek <gamesb...@gmail.com> wrote:
>
>
>
> > I  have set of models, with relationships D -> C -> B -> A, where the
> > "->" indicates a "many to one" relationship.
>
> > I have been able to create a filtered queryset on child model D, based
> > on a value in a parent model A, using the following syntax:
>
> > my_query = D.objects.filter(C__B__A__name__icontains = "foo")
>
> > where model A has a field called "name".
>
> > I need to be able to display the value of the "name" field from A,
> > along with the field attribute data from D in a template.
>
> > I have therefore added the following to the end of my_query:
>
> > .select_related('C__B__A__name')
>
> > Assuming the template is called with the context containing:
>
> > 'results': my_query
>
> > then I can use {{ results.name }}, for example, to retrieve the value
> > of the "name" field from model D.
>
> > However I am unable to figure out the correct syntax for retrieving
> > the value of the "name" field from related model A.
>
> > I have tried  {{ results.C.B.A.name }} with no effect?
>
> > What is the correct way to do this?
>
> > Thanks
> > Derek
>
> Firstly, your select_related syntax is wrong. You don't need it to
> access related objects, but it does help cut down on db queries.
> However, it doesn't go down to field level, so you just want
> 'C__B__A'.
>
> Secondly, your 'results' object is a queryset, so you *can't* do
> 'results.name' as you claim. A queryset is a collection of items, not
> a single one, so 'results' as a whole doesn't have either 'name' or
> 'C' attributes. However, once you iterate through the queryset, each
> individual item inside it does have both 'name' and 'C' attributes. So
> this will work:
>
> {% for result in results %}
>     {{ result.name }} : {{ result.C.B.A.name }}
> {% endfor %}
>
> An easy way of exploring all this is via the shell - you could have
> seen the result of your query there, and accessed the individual
> objects and their attributes.
> --
> DR.

Daniel

Thanks for the heads-up about working in the shell.  I have found out
more useful commands and syntax in doing so (e.g. showing the SQL from
the query via my_query.query.as_sql() ).

I had the right idea (e.g. I was working with the {% for result in
results %}  loop, even though I did not indicate that to the original
question) .  The root of the problem was that my model relationships
were incorrect i.e. D <- C -> B -> A  and so I had to restructure the
query.

Derek

-- 
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.

Reply via email to