【发布时间】:2018-03-14 08:56:42
【问题描述】:
假设我有这个模型,我想通过逻辑操作对它们进行排序n1 != n2:
class Thing(Model):
n1 = IntegerField()
n2 = IntegerField()
...
def is_different(self):
return self.n1 != self.n2
如果我按照sorted内置函数对它们进行排序,我发现它返回的不是Queryset,而是一个列表:
things = Thing.objects.all()
sorted_things = sorted(things, key=lambda x: x.is_different())
现在,如果我使用annotate
sorted_things = things.annotate(diff=(F('n1') != F('n2'))).order_by('diff')
它会引发以下错误:AttributeError: 'bool' object has no attribute 'resolve_expression'。
我找到了使用extra 查询集的解决方案:
sorted_things = things.extra(select={'diff': 'n1!=n2'}).order_by('diff')
但遵循 Django 文档 (https://docs.djangoproject.com/en/2.0/ref/models/querysets/#extra):
将此方法作为最后的手段
这是一个旧的 API,我们打算在未来的某个时候弃用它。仅当您无法使用其他查询集方法表达您的查询时才使用它。如果您确实需要使用它,请在您的用例中使用 QuerySet.extra 关键字提交一个工单(请先检查现有工单列表),以便我们可以增强 QuerySet API 以允许删除 extra()。我们不再改进或修复此方法的错误。
那么,最好的方法是什么?
谢谢!
【问题讨论】:
标签: python django django-queryset