大于 Django 中的索引
Greater than Index in Django
在 Django-3.2 中 class 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(
<b>ExpressionWrapper(</b>
Q(quantity__gt=0),
output_field=BooleanField()
<b>)</b>,
name='<i>some_name_for_the_constraint</i>'
)
]
将在 SQL 中翻译为:
CREATE INDEX `<i>some_name_for_the_constraint</i>`
ON `app_name_product` ((`quantity` > 0));
但是通常 db_index=True
[Django-doc] 足以加速过滤器,因为它们通常由一些树状结构实现,因此将确定要在 O(log n ).
因此我们可以将其设置为:
class Product(models.Model):
# …
quantity = models.IntegerField(
<b>db_index=True</b>,
validators=[MinValueValidator(0)]
)
这会很快工作。
在 Django-3.2 中 class 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(
<b>ExpressionWrapper(</b>
Q(quantity__gt=0),
output_field=BooleanField()
<b>)</b>,
name='<i>some_name_for_the_constraint</i>'
)
]
将在 SQL 中翻译为:
CREATE INDEX `<i>some_name_for_the_constraint</i>`
ON `app_name_product` ((`quantity` > 0));
但是通常 db_index=True
[Django-doc] 足以加速过滤器,因为它们通常由一些树状结构实现,因此将确定要在 O(log n ).
因此我们可以将其设置为:
class Product(models.Model):
# …
quantity = models.IntegerField(
<b>db_index=True</b>,
validators=[MinValueValidator(0)]
)
这会很快工作。