【问题标题】:order_by() doesn't work with filter() in Django vieworder_by() 不适用于 Django 视图中的 filter()
【发布时间】:2011-05-24 17:55:45
【问题描述】:

我的模特:

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

【问题讨论】:

  • 你不会在稍后的某个地方做类似 bilder.order_by(...) 的事情,是吗?
  • 在将图片发送到模板之前,您是否对图片进行了处理?
  • 我现在在一个项目中执行相同类型的过滤器和 order_by,语法与我的相同,但我的工作......我将在 shell 中玩有点并试图解决这个问题
  • 我稍后在涉及 bilder 的视图中唯一做的是:empties = range(18 - len(bilder))

标签: django


【解决方案1】:

我已经做了很多.filter().order_by() 链,就像你在那里一样,没有什么东西让我觉得不合适。我从来没有尝试过在不进一步处理对象的情况下将这种排序转移到模板中(通常会遍历它们),所以我想知道 order_by() 是否作为 django 惰性评估的一部分丢失了?也许尝试将filter().order_by() 行包装在list() 中以强制在那里进行评估,而不是将其推迟到稍后的时间?

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

这是在黑暗中拍摄,但足够快,值得一试。

【讨论】:

  • 感谢您的建议!可悲的是不是这样。我认为通过不将所有数据提供给模板可以避免这个问题。就我而言,无论如何这可能效率低下。但我还是很好奇……
  • 哦,对不起。它确实有效!真的谢谢你!使用 list() 成功了! (虽然我还是不明白为什么……)
【解决方案2】:

您应该尝试按 slot__id 订购。

像这样:

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

【讨论】:

    【解决方案3】:

    在您的 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

    【讨论】:

      【解决方案4】:

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

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

      Original answer that helped me

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-05-26
        • 2018-06-28
        • 2016-01-16
        • 2016-01-30
        • 2020-10-01
        • 2016-06-18
        • 2020-05-08
        相关资源
        最近更新 更多