Django 七
2021-08-12 本文已影响0人
吃可爱长大鸭
目录
1.orm常用和非常用字段
2.orm字段参数
3.orm字段关系
4.手动创建第三张表(了解)
5.Meta元信息
6.原生sql
1.orm常用和非常用字段
1.常用
AutoField IntegerField CharField DateField DateTimeField
2.不常用的
BooleanField TextField FileField
2. orm字段参数
1 null 是否可以为空
2 unique 是否唯一
3 db_index 是否给该字段建索引
4 default 默认值为
5 DateField和DateTimeField 两个参数
#### auto_now_add
配置auto_now_add=True,创建数据记录的时候会把当前时间添加到数据库。
#### auto_now(对象.属性 对象.save()) queryset.update无效
配置上auto_now=True,每次更新数据记录的时候会更新该字段。
6 choices(知道)
-在model表模型定义的时候给某个字段指定choice
sex_choice=((1,'男'),(2,'女'),(0,'未知'))
sex =models.IntegerField(default=1,choices=sex_choice)
-在使用的时候,直接取出中文
对象.get_sex_display()
7 了解的
verbose_name Admin中显示的字段名称
blank Admin中是否允许用户输入为空
editable Admin中是否可以编辑
help_text Admin中该字段的提示信息
choices Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作
3.orm字段关系
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-跟ForeignKey
4 ManyToManyField:如何手动创建第三张表
4.手动创建第三张表(了解)
-字段参数
-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 Book1(models.Model):
title = models.CharField(max_length=32, verbose_name="书名")
# 自己创建第三张表,并通过ManyToManyField指定关联
class Author1(models.Model):
name = models.CharField(max_length=32, verbose_name="作者姓名")
books = models.ManyToManyField(to="Book1", through="Author2Book", through_fields=("author", "book"))
# through_fields 元组的第一个值是ManyToManyField所在的表去中间表通过那个字段,就写在第一个位置
class Author2Book(models.Model):
author = models.ForeignKey(to="Author1")
book = models.ForeignKey(to="Book1")
##基于对象的跨表查,还能继续使用
## 基于双下划綫连表查
## 原来的多对多操作api用不了了,需要手动操作
第三种
class Book1(models.Model):
title = models.CharField(max_length=32, verbose_name="书名")
class Author1(models.Model):
name = models.CharField(max_length=32, verbose_name="作者姓名")
# 自己创建第三张表,分别通过外键关联书和作者
class Author2Book1(models.Model):
author = models.ForeignKey(to="Author")
book = models.ForeignKey(to="Book")
5.Meta元信息
# 在每一个模型类中都可以写
class Meta: #元信息
db_table='lqz_publish' #表名
index_together=('name','city') # 多个字段联合索引
unique_together=('name','city') # 联合唯一
ordering=('nid', ) # 默认以哪个字段排序
6.原生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)
res = models.Author.objects.raw('select * from app01_book where nid>1')
for book in res:
print(book.price)
# 执行原生sql,跟对象类型无关了,查出什么字段,可以直接使用该字段