我的模特:
...
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 %}
答案 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行。