2

我有一个模型,它使用 Meta ordering 属性来确保使用它的所有视图都以相同的顺序显示事物。

但是,我有一种方法需要使用该distinct()方法 - 应用订购后这不起作用。在应用排序之前是否有内置的方法来检索原始查询集,或者我是否需要编写一个自定义的 Manager 类来允许我这样做。

4

2 回答 2

4

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 中定义的子句。

于 2013-09-04T23:12:25.063 回答
2
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()等等......对于有序的查询集,没有任何改变!

于 2013-09-04T07:26:13.370 回答