1.null 是否可以为空
2.unique 是否唯一
3.db_index 是否给该字段建索引
4.default 默认值为
5.DateField和DateTimeField 两个参数
# auto_now_add
配置auto_now_add=True,创建数据记录的时候会把当前时间添加到数据库
# auto_now
配置auto_now=True,每次更新数据记录的时候会更新该字段
6.choices
在model表模型定义的时候给某个字段指定choice
sex_choice=((1,'男'),(2,'女'))
sex=models.IntegerField(default=1,choices=sex_choice)
在使用的时候,直接取出中文
对象.get_sex_display()
前端
<td>{{ author.get_sex_display }}</td>
7.了解的
verbose_name Admin中显示的字段名称
blank Admin中是否允许用户输入为空
editable Admin中是否可以编辑
help_text Admin中该字段的提示信息
choices Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作
字段关系
1.一对一 一对多 多对多
2.ForeignKey
to:对哪张表
to_field:对表中的某个字段
related_name:反向操作时,使用的字段名,用于代替原反向查询时的 表名_set
related_query_name:反向查询操作时,使用的连接前缀,用于替换表名
on_delete: # 级联删除
当删除关联表中的数据时,当前表与其关联的行的行为
models.CASCADE
删除关联数据,与之关联也删除
models.DO_NOTHING
删除关联数据,什么都不做
models.PROTECT
删除关联数据,引发错误ProtectedError
models.SET_NULL
删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空)
models.SET_DEFAULT
删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值)
models.SET
删除关联数据,
a. 与之关联的值设置为指定值,设置:models.SET(值)
b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)
db_constraint
True:建立外键,默认是True
False:不建立外键
外键是否建立:
好处:不会出现脏数据
坏处:插入的时候,效率低
3.OneToOneField # 一对一
4.ManyToManyField # 多对多
手动创建第三张表
字段参数
db_table:指定第三张表的名字
to:关联的表
related_name 同ForeignKey字段
related_query_name 同ForeignKey字段
through:手动创建第三张表,指定通过哪个表
through_fields:关联字段是什么
多对多关系建立的三种方式
第一种:自动创建 # 常用:第三张表没有其它字段
第二种:手动创建第三张表 # 比较常用:第三张表有多余字段
第三种:完全手动写第三张表
# 第一种:自动创建
class Book(models.Model):
title=models.CharField(max_length=32,verbose_name='书名')
# 通过orm自带的ManyToManyField自动创建第三张表
class Author(models.Model):
name=models.CharField(max_length=32,verbose_name='作者姓名')
books=models.ManyToManyField(to='Book',related_name='authors')
# 第二种:手动创建第三张表,第三张表有多余字段
class Book(models.Model):
title=models.CharField(max_length=32,verbose_name='书名')
# 自己创建第三张表,并通过ManyToManyField指定关联
class Author(models.Model):
name=models.CharField(max_length=32,verbose_name='作者姓名')
books=models.ManyToManyField(to='Book',through='Author2Book',through_fields=('author','book'))
# through_fields 元组的第一个值是ManyToManyField所在的表去中间表通过哪个字段,就写在第一个位置
class Author2Book(models.Model):
author=models.ForeignKey(to='Author')
book=models.ForeignKdy(to='Book')
sex_choice=((1,'男'),(2,'女'))
sex=models.IntegerField(default=1,choices=sex_choice)
'''
1.基于对象的跨表查,还能继续使用
2.基于双下划线连表查
3.原来的多对多操作api用不了了,需要手动操作
'''
# 第三种:完全手动写第三张表
class Book(models.Model):
title=models.CharField(max_length=32,verbose_name='书名')
class Author(models.Model):
name=models.CharField(max_length=32,verbose_name='作者姓名')
# 自己创建第三张表,分别通过外键关联书和作者
class Author2Book(models.Model):
author=models.ForeignKey(to='Author')
book=models.ForeignKey(to='Book')
# 在每一个模型类中都可以写
class Meta: # 元信息
db_table='ldb_publish' # 表名
index_together=('name','city') # 多个字段联合索引
unique_together=('name','city') # 联合唯一
ordering=('nid',) # 默认以哪个字段排序
原生sql
from app01 import models
res=models.Author.objects.all()
for author in res:
print(author.sex)
print(author.get_sex_display())
# 使用原生sql
res=models.Author.objects.raw('select * from app01_author where nid>1')
for author in res:
print(author.name)
# 执行原生sql,跟对象类型无关了,查出什么字段,可以直接使用该字段
res=models.Author.objects.raw('select * from app01_book where nid>1')
for book in res:
print(book.price)