django 1.11及以后允许使用 F
-expressions添加 nulls last
选项以查询:
queryset = Person.objects.all().order_by(F('wealth').desc(nulls_last=True))
但是,我们要使用此功能来创建索引。模型定义中的标准Django索引:
indexes = [
models.Index(fields=['-wealth']),
]
我尝试了以下内容:
indexes = [
models.Index(fields=[models.F('wealth').desc(nulls_last=True)]),
]
返回AttributeError: 'OrderBy' object has no attribute 'startswith'
。
在django中使用 F
-expressions可以做到这一点?
否,不幸的是,当前是不可能的(django< = 2.1(。如果您查看models.Index
的来源,您会发现它假设参数fields
包含模型名称,而没有其他。
作为解决方法,您可以在迁移中使用RAW SQL手动创建索引。
幸运的是,由于Django 3.2,现在可以创建功能索引。您发布的示例必须通过将字段从fields
移动到*expressions
并添加名称来调整一点,这是使用表达式时所必需的。
indexes = [
Index(F('wealth').desc(nulls_last=True), name='wealth_desc_idx'),
]
https://docs.djangoproject.com/en/3.2/ref/models/indexes/#expressions