python---django中orm的使用(4)字段,参数(on_delete重点)补充,,1.索引:普通索引:
python---django中orm的使用(4)字段,参数(on_delete重点)补充,,1.索引:普通索引:
1.索引:
普通索引:加快查找速度
唯一索引:加快查找速度,唯一约束
主键索引:加快查找速度,唯一索引,不为空
class UserInfo(models.Model): username = models.CharField( null=False, #不允许为空 db_column=‘user‘, #自定义列名,可以修改再数据库中的列名 max_length=32, db_index=True, #普通索引,只能加速查找 # unique=True, #约束索引,加速查找,唯一约束 # primary=True, #主键索引,加速查找,唯一约束,不为空 )
gender = models.BooleanField( default=True #设置默认值 )
元类使用:
用于生成联合索引,以及设置个别参数
#元类信息 class Meta: # 数据库中生成的表名称 默认 app名称 + 下划线 + 类名 db_table = "app01_un" # 联合索引 # index_together = [ # ("username", "gender"), # ] # 联合唯一索引 unique_together = (("username", "gender"),) #IntegrityError: columns user, gender are not unique # admin中显示的表名称 verbose_name = "用户信息"
一对多外键建立:
el = models.ForeignKey( to="EmailInfo", #关联表 to_field=‘id‘, #关联列名
db_constraint=True #是否在数据库该表中创建外键约束(外键功能查找等依旧存在,但是不具有约束功能)
limit_choices_to=None, #在Admin或者ModelForm中显示数据时,提供限制后的数据展示
--limit_choices_to={‘id_gt‘:5}
--limit_choices_to=lambda:{‘id_gt‘:5}#或者lambda表达式 )
class EmailInfo(models.Model): email = models.EmailField( null=False, db_index=True, unique=True, )外键关联表EmailInfo
添加信息:
#添加信息 UserInfo.objects.create( username="张三", gender=True, el_id=1 ) UserInfo.objects.create( username="李四", gender=True, el_id=2 )
#因为唯一约束,是对姓名,性别一起约束,所以当不同时,是可以进行添加的 UserInfo.objects.create( username="王五", gender=False, el_id=3 ) UserInfo.objects.create( username="王五", gender=True, el_id=3 ) UserInfo.objects.create( username="赵六", gender=True, el_id=4 ) EmailInfo.objects.create(**{‘email‘: ‘[email protected]‘}) EmailInfo.objects.create(**{‘email‘: ‘[email protected]‘}) EmailInfo.objects.create(**{‘email‘: ‘[email protected]‘})
对于外键,删除是是默认为级联删除,当删除一个,对应相关数据也会被删除,所以,我们有时候需要修改这一性质,在创建外键是使用on_delete即可
对于on_delete的几种设置:
def set_test(): return 4
el = models.ForeignKey( to="EmailInfo", #关联表 to_field=‘id‘, #关联列名 null=True, default=2, #删除自己数据,对于被关联方,一点影响都没有 #on_delete=None, #当关联的email数据被删除时候,该数据也会被删除,不存在 #on_delete=models.CASCADE, #性质和None一样是默认删除
#on_delete=models.DO_NOTHING, #当关联的数据被删除时,自己不受影响,什么事都不做,不会报错
#on_delete=models.PROTECT, #关联保护,因为邮箱数据被用户表关联,所以该邮箱不允许被删除,并且触发ProtectError #Cannot delete some instances of model ‘EmailInfo‘ because they are referenced through a protected foreign key: ‘UserInfo.el‘", <QuerySet [<UserInfo: UserInfo object>]>
#on_delete=models.SET_NULL, #删除关联数据,自己被设置为null(前提字段需要设置为可空null=True) #对于测试models.SET_NULL时,我们需要先了解,对于数据库的基本字段设置,像null,max_length这些属性,我们需要重新去生成数据表, #对于on_delete等Django中的附属属性,我们可以动态修改,不需要重新生成数据表,所以如果我们开始并没有设置null=True(默认false),我们需要去重新生成数据表 #on_delete=models.SET_DEFAULT,#删除关联数据后,会将自己的数据设置为默认值,需要设置default属性
#on_delete=models.SET(3) #和SET_DEFAULT相似,只不过不需要设置默认值,在SET()中可以直接设置 on_delete=models.SET(set_test) #和SET一样,只不过值设为了回调函数,需要将函数设为全局,可调用 )
python---django中orm的使用(4)字段,参数(on_delete重点)补充
相关内容
- 【Python3】 使用django 2.0 + python3.6.4 创建应用,,python版本
- python面试题(转),,1.How are
- Python-类继承,,当在Python中出
- Python(46)_修改文件,python46修改文件,#-*-coding
- 判断python字典中key是否存在的两种方法,pythonkey,在py
- python函数星号参数详解,python星号参数详解,参数前加一
- Python中set的用法,Pythonset用法, 1. 先看下pyt
- python set 使用介绍,pythonset,Set是简单对象的无需集
- python修改字典内key对应的值,python字典key对应,d2 = {'s
- python提交post数据到远程url,python提交posturl,import sys,
评论关闭