Django queryset差异方法失去顺序

时间:2019-03-06 22:01:38

标签: django django-queryset

我正在尝试在查询集上使用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的bug? 如果可以的话,是否有找到2个查询集之间差异的适当方法?

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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

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