Hi,

I try to populate a template from a Model with a ForeignKey element)
members of the foreign key element should be displayed.

If I understand correctly my first attempt resulted in one query for
fetching the entries from my first model and in one Query for each row
in order to look up the contents related to the foreign key.



I try to explain with a simple example.

####### The Models ########################################
class Composer(models.Model):
    last_name  = models.CharField(max_length=20)
    first_name = models.CharField(max_length=20)

class Song(models.Model):
    title = models.CharField(max_length=20)
    composer = models.ForeignKey(Composer)

############# My Task ##################
Now I want to populate a template with a list of songs and their composers


Intuitive lazy Solution with many queries
===========================================

The view
-----------
songs = Song.objects.all()
return render_to_response('mytemplate.html', {'song_list' : songs })


The template
---------------
{% for song in song_list %}
{{ song.title }} by {{ song.composer.last_name }},
{{song.composer.first_name }} <br/>
{% endfor %}


The problem
---------------
The problem here is, that django will perform one query to get the list
of songs and will then get perform one query per row in order to look up
the composer by his primary key.


I would prefer to  have one query with a join


The verbose solution
=======================

I  use values() in order to force the join upfront before rendiering in
the template


The view
-------------
songs = Song.objects.all().values('title', 'composer__last_name',
'composer__first_name')
return render_to_response('mytemplate.html', {'song_list' : songs })


The template
--------------
{% for song in song_list %}
{{ song.title }} by {{ song.composer__last_name }},
{{song.composer__first_name }} <br/>
{% endfor %}




The problem
-------------

This seems to do what I like, however there is one tiny problem.

I have to list all members of both models in the values section.
This seems to be rather verbose and repetetive.


My Questions
==============

1.) What is the recommended way to fill a template with values from a
model requiring one (or in my real example even two) joins.



2.) Is it possibe to perform a query and ask it to get ALL values from
the first model and to 'join' ALL values from a second model?
This would avoid having to manually retype all Model members in the
view-code


3.) Is there a way to perform a query with a join, but to receive
an object for each row (instead of receiving a dict with the 'flattened'
values containing double underscores as separators)

This would allow me to still use 'song.composer.last_name' in the
template but to avoid one query per template row



Thanks a lot for your suggestions or for clarifying my potential
misunderstandings of how Django works is supposed to be used.






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

Reply via email to