摘要
本文部分内容来源于网络,个人收集整理,请勿传播
Django框架中Model知识点
db first
: 自己再数据库先创建表结构,然后再连接数据库,在本地生成类code first
: 先写数据量对应类,然后执行命令通过类生成数据库
1 | m = models.TB |
字段
1 | AutoField(Field) |
自定义无符号整数字段
1 | class UnsignedIntegerField(models.IntegerField): |
触发Model中的验证和错误提示有两种方式
1 | a. Django Admin中的错误信息会优先根据Admiin内部的ModelForm错误信息提示, |
admin中修改错误提示
1 | # admin.py |
字段参数
1 | null 数据库中字段是否可以为空 |
元信息
1 | class UserInfo(models.Model): |
更多:https://docs.djangoproject.com/en/1.10/ref/models/options/
多表关系
应用场景
- 一对多:
models.ForeignKey(其他表)
- 当一张表中创建一行数据时,有一个单选的下拉框(可以被重复选择)
- 例如:创建用户信息时候,需要选择一个用户类型【普通用户】【金牌用户】【铂金用户】等。
- 多对多:
models.ManyToManyField(其他表)
- 在某表中创建一行数据是,有一个可以多选的下拉框
- 例如:创建用户信息,需要为用户指定多个爱好
- 一对一:
models.OneToOneField(其他表)
- 在某表中创建一行数据时,有一个单选的下拉框(下拉框中的内容被用过一次就消失了)
- 例如:原有含10列数据的一张表保存用户信息,需要增更加详细的用户信息,可以原表加字段,也可以用一对一表
ForeignKey(ForeignObject)
ForeignObject(RelatedField)
to
, # 要进行关联的表名to_field=None
, # 要关联的表中的字段名称on_delete=None
, # 当删除关联表中的数据时,当前表与其关联的行的行为models.CASCADE
,删除关联数据,与之关联也删除models.DO_NOTHING
,删除关联数据,引发错误IntegrityErrormodels.PROTECT
,删除关联数据,引发错误ProtectedErrormodels.SET_NULL
,删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空)models.SET_DEFAULT
,删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值)models.SET
,删除关联数据,- 与之关联的值设置为指定值,设置:
models.SET(值)
- 与之关联的值设置为可执行对象的返回值,设置:
models.SET(可执行对象)
- 与之关联的值设置为指定值,设置:
1 | def func(): |
related_name=None
, # 反向操作时,使用的字段名,用于代替 【表名_set】 如:obj.表名_set.all()
related_query_name=None
, # 反向操作时,使用的连接前缀,用于替换【表名】models.UserGroup.objects.filter(表名__字段名=1).values('表名__字段名')
limit_choices_to=None
, # 在Admin或ModelForm中显示关联数据时,提供的条件
1 | limit_choices_to={'nid__gt': 5} |
db_constraint=True
, # 是否在数据库中创建外键约束parent_link=False
, # 在Admin中是否显示关联数据
OneToOneField(ForeignKey)
1 | # 参数说明 |
多对多
参数说明
1 | to |
批量添加数据
1 | # views.py |
自定义第三张表
1 | class Boy(models.Model): |
ManyToManyField(RelatedField)
无法直接对第三张表操作
1 | # models.py |
ManyToManyField + 自定义第三张表
1 | # modles.py |
自关联
1 | # 有一个朋友关系的字段,多对多关联到自身, |
自关联多字段
如果在一张表中有多个ManayTOManay
字段关联到相同的另一张表中,则另一张表在反向查询时则无法准确查找,为了解决这个问题,你需要在多对多字段添加一个参数related_name
并命名一个和其它多对多字段不同的名字
1 | models.ManyToManyField('self', related_name='user_attentions') |
自关联多对多
1 | class Module(models.Model): |
limit_choices_to
1 | limit_choices_to={'nid__gt': 5} |
ORM操作
基本操作
1 | # 增 |
进阶操作
利用双下划线将字段和对应的操作连接起来
1 | # 获取个数 |
高级操作
1 | # extra |
连表操作
利用双下划线和_set
将表之间的操作连接起来
表结构实例
1 | class UserProfile(models.Model): |
1 | # 一对一操作 |
其他操作
1 | ################################################################## |
其他
Django原生SQL获取cursor字典
1 | import pymysql |
数字自增、字符串更新
1 | # 数字自增 |
ORM函数相关
1 | # ########### 基础函数 ########### |
ORM自定义函数
1 | from django.db.models.functions.base import Func |
配置
1 | class Env(models.Model): |
事务操作
1 | from django.db import transaction |