微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

大于 Django 中的索引

如何解决大于 Django 中的索引

在 Django-3.2 类 Index 中获得一个位置参数 expressions 允许在表达式上创建函数索引

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

我的模型:

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

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

解决方法

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

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)]
    )

这会很快工作。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。