博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

orm字段参数

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

Meta元信息

# 在每一个模型类中都可以写
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)