【问题标题】:Django queryset difference method loosing orderingDjango queryset差异方法失去排序
【发布时间】:2019-07-28 16:39:33
【问题描述】:

我正在尝试在查询集上使用 Django 内置的差异方法,但使用差异方法后似乎排序消失了。

objects = self.get_index_children()
print("objects are %s ordered" % objects.ordered)

featured_recipes = objects.filter(featured=True)[:3]
print("featured_recipes are %s ordered" % featured_recipes.ordered)

latest_recipes = objects.difference(featured_recipes)
print("latest_recipes are %s ordered" % latest_recipes.ordered)  




objects are True ordered
featured_recipes are True ordered
latest_recipes are False ordered . <----

这应该是这样还是 django 方面的错误? 如果是这样,是否有任何适当的方法可以找到 2 个查询集之间的差异?

【问题讨论】:

    标签: django django-queryset


    【解决方案1】:

    difference() 转换为 EXCEPT 子句,其语法取决于数据库后端。

    对于 SQLite,Django 在 difference() 的任一侧使用有序查询集时会引发错误。

    对于 Postgres,子查询的排序是允许的,但它只影响子查询(这仅在子查询被切片时才有意义)。

    对于两个后端,要对结果查询进行排序,您需要向结果查询集添加显式 .order_by(...)

    q3 = q1.difference(q2).order_by('name')
    

    关于您的最后一个问题,这里是docs for difference。该函数返回一个查询集,其中包含一个查询集中的元素减去一个或多个其他查询集中的元素。排序在这里没有直接关系。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-07
      • 2018-06-05
      • 2011-02-24
      • 1970-01-01
      • 2021-02-28
      • 1970-01-01
      相关资源
      最近更新 更多