1、DecimalField
DecimalField保存浮点型数据比FloatField精确,因为它是以字符串来保存,而FloatField,数据越长,保存得越不精确。
2、索引
(命中索引) 正确使用SQL语言,使查找数据时,用到索引
username=models.CharField(
...
# db_index=True 数据库中字段是否可以建立索引 在数据库中数据很大时,建立该索引,可以查找得更快(加速查找)
# unique= 数据库中字段是否可以建立唯一索引 加速查找 && 限制列值唯一
# primary_key= 加速查找 && 限制列值唯一 && 不能为空
# unique_for_date= 数据库中字段【日期】部分是否可以建立唯一索引
# unique_for_month= 数据库中字段【月】部分是否可以建立唯一索引
# unique_for_year= 数据库中字段【年】部分是否可以建立唯一索引
...
)
3、一对一
使foreignkey唯一 或使用oneToOneField
4、ForeignKey
a、关联删除
"""
on_delete = models.CASCADE, 删除关联数据,与之关联也删除
models.DO_NOTHING,删除关联数据,引发错误IntegrityError
models.PROTECT,删除关联数据,引发错误ProtectedError
models.SET_NULL,删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空)
models.SET_DEFAULT, 删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值)
models.SET ,删除关联数据,
a、与之关联的值设置为指定值,设置:models.SET(值)
b、与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)
"""
b、related_name, related_query_name, limit_choices_to
related_name='b', # 反向查找时,用obj.b
related_query_name='b', # 反向查找时,用obj.b_set
limit_choices_to={'id__gt':1}, # Admin中关联的部门id要求大于1 (只在Admin中生效)
5、联合唯一
class UserToTag(models.Model):
u = models.ForeignKey(to='User')
t = models.ForeignKey(to='Tag')
ctime=models.DateField()
...
class Meta:
# 联合唯一 即两条记录中 u和t 不能重复
unique_together=[
('u','t'),
]
6、多对多的高级方式
通过through属性 指定第三张表 为自己创建的表
这样,第三张表就可以有不只三列数据
但这时候,.add .set .remove等方法不能使用了 .all .filter 还可以使用
因此,这种通过through属性关联起来的第三张表多对多方式 不推荐。
推荐:普通manyTomany 或 自创建第三张表但不through关联
class Tag(models.Model):
title = models.CharField(max_length=16)
# 使用ManyToManyField只能在第三张表中创建三列数据
m = models.ManyToManyField(
to='UserInfo',
through='UserToTag', # 通过through指定第三张表就可以有三列以上的数据
through_fields=['u','t']
)
7、自关联
(ManyToMany)自关联时,related_name必须设置,方便反向查询
8、extra
9、Using :指定使用的数据库
10、raw
# 执行原生SQL语句
models.UserInfo.objects.raw('select * from userinfo')
# 其它
...
11、dates查询
12、批量创建bulk_create
13、in_bulk
models.UserInfo.objects.in_bulk([1,2,3]) #查询主键为1,2,3的记录