django - 如何在 django 2.2 模型中创建部分索引
问题描述
我在 Django 2.2 中有这样的模型
class Post(models.Model):
class Meta:
verbose_name = _('Post')
verbose_name_plural = _('Posts')
phone_number = models.CharField(max_length=11, verbose_name=_('Phone number'), db_index=True)
token = models.CharField(unique=True, max_length=20, verbose_name=_('Token'), db_index=True)
post_state = models.SmallIntegerField(choices=[
(PostState.NEW, _('New')),
(PostState.PUBLISHED, _('Published')),
(PostState.ARCHIVED, _('Archive')),
(PostState.REMOVED_BEFORE_PUBLISH, _('Removed before publish')),
(PostState.REJECTED_AFTER_PUBLISH, _('Rejected after publish')),
], default=PostState.NEW, verbose_name=_('Post state'), db_index=True)
我希望我在 phone_number 和 token 上的索引基于 post_state 值是部分的,我知道如何在 Postgres shell 中使用 SQL 命令来做到这一点,但我不知道如何在 django 模型中做到这一点,所以它进入了迁移文件也。
解决方案
从Django 索引和索引选项中,您可以简单地将索引添加到模型元类:
from django.db.models import Index
class Meta:
indexes = [
Index(fields=['phone_number',], condition=Q(post_state__in=[PostState.NEW, PostState.PUBLISHED])),
Index(fields=['token',], condition=Q(post_state__in=[PostState.NEW, PostState.PUBLISHED])),
... # other indexes
]
推荐阅读
- machine-learning - Python - 如何通过提供其他参数来预测特征销售价值?使用 LSTM 还是?
- c# - 在每个 panel.Paint() 窗口窗体上执行的异步数据库函数
- google-analytics - Google Analytics(分析)受众数据未传递给 Google Ads
- bluetooth-lowenergy - Python Bleak BLE没有获得UUID
- jquery - 如何防止事件进入无限循环?
- dask - AttributeError:模块“dask”没有属性“延迟”
- python - 使用 os.walk 从每个目录中获取第一个文件
- html - Woocommerce 单一产品页面,标题、描述和内容都垂直显示在产品图像下方
- sql - 链接到 Access 的 SQL 表显示 0 而不是 NULL
- c++ - 将 const T& 作为 this 传递给 constexpr 成员函数