1. 在我们创建一个模型时,Django的ORM会根据应用名(app name), 模型名(model name)和字段名(field name)自动在数据库中创建数据表。
2. 比如我们有一个Blog的应用,里面有Article模型, 其中Article模型有title这个字段,那么
3. Django默认会创建一个名为blog_article的数据表,
其中有title这个字段。假如我们希望把表名改为article,标题改为article_title,以便与已经存在的数据表或字段建立映射关系,我们可以按如下代码操作。
- 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自定义数据表名
1. 使用索引可快速访问数据库表中的特定信息。
2. 数据库索引好比是一本书前面的目录,没有索引目录的话,你访问书中某个页面需要从第一页遍历到最后一页,如果有目录,你可以快速地根据目录查找到所需要的页面。
3. Django项目中如果你需要频繁地对数据表中的某些字段(如title)使用filter(), exclude()和order_by()方法进行查询,我们强烈建议你对这些字段建议索引(index), 提升查询效率。
要对模型中的某个字段建立数据库索引,你可以使用db_index选项,也可以使用Meta选项建立索引。使用Meta选项的好处是你可以一次性对多个字段建立索引,还可以对多个字段建立组合索引。
- class Article(models.Model):
- """文章模型"""
-
- # 使用db_index=True对title建立索引
- title = models.CharField('标题', max_length=200, db_index=True)
- class Article(models.Model):
- """文章模型"""
- title = models.CharField('标题', max_length=200,)
-
- class Meta:
- indexes = [
- models.Index(fields=['title']),
- ]
联合索引的优势
示例SQL:select * from person where a=100 and b=100 and c=1000; 假设你的数据有一千万条 每次条件过滤 省10%的数据
1 如果三个单索引 先拿a的索引找 剩下100万数据 然后拿b条件找 剩十万 再c条件找 最后得到一万数据
2 如果是联合索引 他 一千万数据*10% * 10% * 10% 直接得到一万条数据
建立联合索引的同时 还会给他们之间的组合建立索引
- 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"联合同步查询,提高效率。
- from django.db import models
-
-
-
-
- class Text_one(models.Model):
- title = models.CharField(max_length=225)
- name = models.CharField(max_length=225, db_index=True)
- count = models.IntegerField(default=100)
-
- class Meta:
- constraints = [
- # 联合唯一
- models.UniqueConstraint(fields=['name', 'title'], name='unique_name')
- ]