order_by()不适用于Django视图中的filter()

时间:2011-05-24 17:55:46

标签: django

我的模特:

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

我的观点:

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

当我在模板中迭代“bilder”时,我可以看到filter()确实有效,但仍然按pk而不是“slot”排序对象。

我使用filter()和order_by()是否有问题?

编辑:我想我应该补充一点,shell中的一切正常。所以错误可能在模板中......?

{% 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 %}

4 个答案:

答案 0 :(得分:11)

我已经完成了许多.filter().order_by()链,就像你在那里一样,并没有任何东西像我一样跳到我身边。我从来没有尝试过将这种排序传递给模板而不进一步处理对象(通常迭代它们),所以我想知道order_by()是否会丢失作为django懒惰评估的一部分?也许尝试将filter().order_by()行包裹在list()中以强制进行评估,而不是将其推迟到以后的某个时间?

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

这是一个黑暗中的镜头,但很快就值得一试。

答案 1 :(得分:5)

你应该尝试按slot__id订购。

像这样:

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

答案 2 :(得分:0)

在您的 views.py 中 您无需使用

filter(album__id = album_id)

(带双下划线) 因为“相册”与ManyToManyField没有关联

这里的相册只是外键

因此 views.py 应该具有

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

(带有下划线)。

对Django文档的引用:https://docs.djangoproject.com/en/2.0/topics/db/queries/#lookups-that-span-relationships

答案 3 :(得分:0)

如果您也使用Django Rest Framework,那么我最终在这里搜索了为什么将.order_by()应用于ModelView中的查询集时不管是否存在.filter()都不起作用。

如果您不需要定义自己的get_queryset,请不要! django-filters库为我解决了这个问题,仅使用OrderFilter就可以将我的条件get_queryset函数替换为3行。

Original answer that helped me