Django 索引与联合索引-------和自定义表名

索引

索引可以极大的提高数据的查询速度,但是会降低插入、删除、更新表的速度,因为在执行这些写操作时,还要操作索引文件

 Django中建立索引

class PressureSensor(models.Model):
    store = models.ForeignKey(Store, verbose_name='门店ID', on_delete=models.CASCADE)
    barcode = models.CharField(verbose_name='货架码', max_length=12, db_index=True)

当然,除了这一种方式外,还有以下两种,分别是:

  • unique_together 联合主键,包含 index_together
  • index_together 组合索引
    class Meta:
        unique_together = [["store", "barcode"], ["store", "mac_addr_no"]]
 
    class Meta:
        index_together = ["store", "sensor"]

联合索引:
Django索引原则:

主键必定是索引
Django默认会为每个Foreginkey创建一个索引
在Django model中对一张表的几个字段进行联合约束和联合索引,例如在购物车表中,登录的用户和商品两个字段在一起表示唯一记录。

举个栗子:
Django model中购物车表 
 

class Cart(models.Model):
    user = models.ForeignKey(
        MyUser,
        verbose_name="用户"
    )
    goods = models.ForeignKey(
        Goods,
        verbose_name="商品"
    )
    num = models.IntegerField(
        verbose_name="商品数量"
    )
    is_select = models.BooleanField(
        default=True,
        verbose_name="选中状态"
    )
 
    class Meta:
        # 联合约束   其中goods和user不能重复
        unique_together = ["goods", "user"]
        # 联合索引
        index_together = ["user", "goods"]
 
# unique_together = ["goods", "user"]  表示联合约束,其中"goods"和"user"表示不能重复,不能一样。
# index_together = ["user", "goods"] 表示联合索引,其中"goods"和"user"联合同步查询,提高效率。

联合索引的优势
​ 示例SQL:select * from person where a=100 and b=100 and c=1000;

​ 假设你的数据有一千万条 每次条件过滤 省10%的数据

​ 1 如果三个单索引 先拿a的索引找 剩下100万数据 然后拿b条件找 剩十万 再c条件找 最后得到一万数据

​ 2 如果是联合索引 他 一千万数据*10% * 10% * 10% 直接得到一万条数据

​ 建立联合索引的同时 还会给他们之间的组合建立索引

自定义表名

1. 在我们创建一个模型时,Django的ORM会根据应用名(app name), 模型名(model name)和字段名(field name)自动在数据库中创建数据表。

2. 比如我们有一个Blog的应用,里面有Article模型, 其中Article模型有title这个字段,那么

3. Django默认会创建一个名为blog_article的数据表,

其中有title这个字段。假如我们希望把表名改为article,标题改为article_title,以便与已经存在的数据表或字段建立映射关系,我们可以按如下代码操作。

1.2 代码示例

class Article(models.Model):
    """文章模型"""
   
    # 通过db_column自定义数据表中字段名
   title = models.CharField('标题', max_length=200, db_column='article_title')
    slug = models.SlugField('slug', max_length=60, blank=True)
    
    def __str__(self):
        return self.title
        
    class Meta:
        db_table = 'article' # 通过db_table自定义数据表名

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值