我有一个模型,它使用 Meta ordering 属性来确保使用它的所有视图都以相同的顺序显示事物。
但是,我有一种方法需要使用该distinct()
方法 - 应用订购后这不起作用。在应用排序之前是否有内置的方法来检索原始查询集,或者我是否需要编写一个自定义的 Manager 类来允许我这样做。
我有一个模型,它使用 Meta ordering 属性来确保使用它的所有视图都以相同的顺序显示事物。
但是,我有一种方法需要使用该distinct()
方法 - 应用订购后这不起作用。在应用排序之前是否有内置的方法来检索原始查询集,或者我是否需要编写一个自定义的 Manager 类来允许我这样做。
order_by()
在distinct()
没有参数的情况下调用。
来自:https ://docs.djangoproject.com/en/1.5/ref/models/querysets/#order-by
如果您不希望将任何排序应用于查询,即使是默认排序也不行,请不带参数调用 order_by()。
只需做一个快速测试就会发现,如果你Foomodel.objects.order_by().distinct('bar')
正确地删除了所有ORDER BY
子句,即使是在 Foomodel 的 Meta 中定义的子句。
from copy import deepcopy
class ExtendedManager(models.Manager):
def __init__(self):
super(ExtendedManager, self).init()
self.model = deepcopy(self.model)
if self.model._meta.ordering:
del self.model._meta.ordering
class MyModel(models.Model):
...
unordered_objects = ExtendedManager()
通常你应该能够做MyModel.unordered_objects.all()
,MyModel.unordered_objects.filter(...).distinct()
等等......对于有序的查询集,没有任何改变!