Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

order_by() doesn't work with filter() in Django view

Tags:

django

My model:

...
class Bild(models.Model):
    album = models.ForeignKey(Album)
    slot = models.IntegerField()
    bild = models.ImageField(upload_to='bilder', null=True)
    untertitel = models.CharField(max_length=200, null=True)
    def __unicode__(self):

My view:

def album_bild(request, album_id, bild_id):
    album_id = int(album_id)
    bilder = Bild.objects.filter(album__id = album_id).order_by('slot')
    ....

When I iterate through "bilder" in the template, I can see that the filter() did work but the objects are still ordered by the pk instead of the "slot".

Is there a problem with my usage of filter() and order_by()?

EDIT: I guess i should add that everything works fine in the shell. So maybe the error is in the template...?

{% for bild in bilder %}
    <li 
    {% ifequal bild.slot bild_id %}
            class="active" 
    {% endifequal %}
    onclick="window.location.href='/portfolio/{{ album_id }}/{{ bild.slot }}'"><div>{{ bild.slot }}</div></li>
{% endfor %}

{% for i in empties %}
    <li class="empty"></li>
{% endfor %}
like image 946
bentm Avatar asked May 24 '11 17:05

bentm


People also ask

Can you filter a QuerySet?

Working with Filter Easily the most important method when working with Django models and the underlying QuerySets is the filter() method, which allows you to generate a QuerySet of objects that match a particular set of filtered parameters.

What is the purpose of filter () method in django?

The filter() method is used to filter you search, and allows you to return only the rows that matches the search term.


2 Answers

I've done lots of .filter().order_by() chains just as you have them there, and nothing jumps out to me as out of place. I've never tried to carry that ordering over to the template without further processing the objects though (usually iterate over them), so I wonder if the order_by() is lost as part of django's lazy evaluation? Maybe try wrapping the filter().order_by() line in a list() to force evaluation there instead of it being put off till some later time?

bilder = list(Bild.objects.filter(album__id = album_id).order_by('slot'))

It is a shot in the dark, but quick enough to be worth a try.

like image 184
Scott Avatar answered Sep 24 '22 08:09

Scott


You should try to order by slot__id.

Like this:

bilder = Bild.objects.filter(album__id = album_id).order_by('slot__id')
like image 5
klimksh Avatar answered Sep 22 '22 08:09

klimksh