1

在 Django-3.2 类 Index 中,获取一个位置参数表达式,它允许在表达式上创建功能索引

是否可以在表达式更大的整数字段上创建索引?例如

我的模型:

class Product(models.Model):
    description = models.CharField(max_length=50)
    delivery_date = models.DateTimeField(null=True)
    quantity = models.IntegerField(validators=[MinValueValidator(0)])

通常我有一个过滤器(数量> 0)。如何在上面创建表达式索引?

4

1 回答 1

2

您可以使用 anExpressionWrapper创建功能索引:

from django.db.models import BooleanField, ExpressionWrapper, Index, Q

class Product(models.Model):
    # …

    class Meta:
        indexes = [
            Index(
                ExpressionWrapper(
                    Q(quantity__gt=0),
                    output_field=BooleanField()
                ),
            name='some_name_for_the_constraint'
          )
        ]

这将在 SQL 中翻译为:

CREATE INDEX `some_name_for_the_constraint`
          ON `app_name_product` ((`quantity` > 0));

然而,通常一个db_index=True[Django-doc]足以加速过滤器,因为这些通常由一些树状结构实现,因此将确定要在O(log n)中检索的对象。

因此,我们可以将其设置为:

class Product(models.Model):
    # …
    quantity = models.IntegerField(
        db_index=True,
        validators=[MinValueValidator(0)]
    )

这将合理地快速工作。

于 2021-05-03T06:44:27.130 回答