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

如何在 django 2.2 模型中创建部分索引

如何解决如何在 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 模型中执行它所以它进入还有一个迁移文件

解决方法

所以我找到了这个问题的答案。

class Post(models.Model):
    class Meta:
        verbose_name = _('Post')
        verbose_name_plural = _('Posts')
        indexes = (
            BTreeIndex(fields=('token',),condition=Q(post_state__in=[PostState.NEW,PostState.PUBLISHED])),)

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

我们在模型的 Meta 部分创建索引,它有一个条件参数,您可以在其中传递部分条件。

,

Django indexesindex options,您可以简单地向模型元类添加索引:

from django.db.models import Index

class Meta:
        indexes = [
            Index(fields=['phone_number',Index(fields=['token',... # other indexes
        ]

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