Django models中related_name、null/blank、limit_choices_to补充说明
related_name : 相当于我们使用related代替了在通过一个对象查询出多个对象集合时,使用表名_set来获取
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | 我先定义两个模型,一个是作者,一个是作者出版的书籍,算是一对多的类型。 class Person(models.Model); name = models.CharField(verbose_name = '作者姓名' , max_length = 10 ) age = models.IntegerField(verbose_name = '作者年龄' ) class Book(models.Model): person = models.ForeignKey(Person, related_name = 'person_book' ) title = models.CharField(verbose_name = '书籍名称' , max_length = 10 ) pubtime = models.DateField(verbose_name = '出版时间' ) 如果我们要查询一个作者出版了哪些书籍的话,那我们要怎么做呢? 即通过一查询出多的那方面 先查询到作者的信息 person = Person.objects.fiter(你的条件) 返回一个person对象 接下来就查询person关联的所有书籍对象,我们在前面讲过的使用基于对象的查询方式,反向查询按照表名 book = person.book_set. all () django 默认每个主表的对象都有一个是外键的属性,可以通过它来查询到所有属于主表的子表的信息。 这个属性的名称默认是以子表的名称小写加上_set()来表示,默认返回的是一个querydict对象,你可以继续的根据情况来查询等操作。 在实际项目中,我们使用最多的还是related_name 如果你觉得上面的定义比较麻烦的话,你也可以在定义主表的外键的时候,给这个外键定义好一个名称。要用related_name比如在Book表中: person = models.ForeignKey(Person, related_name = 'person_books' ) 那么实现上面的需求,可以使用person.book_set. all () 也可以使用person.person_books. all () |
limit_choices_to:
如models中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | class Depart(models.Model): ''' 部门表 ''' title = models.CharField(verbose_name = '部门名称' ,max_length = 16 ) def __str__( self ): return self .title class ClassList(models.Model): ''' 班级表 ''' school = models.ForeignKey(verbose_name = '校区' ,to = 'School' ,on_delete = models.CASCADE) course = models.ForeignKey(verbose_name = '课程名称' ,to = 'Course' ,on_delete = models.CASCADE) semester = models.PositiveIntegerField(verbose_name = '班级(期)' ) price = models.PositiveIntegerField(verbose_name = '学费' ) start_date = models.DateField(verbose_name = '开班日期' ) graduate_date = models.DateField(verbose_name = '结班日期' ,null = True ,blank = True ) class_teacher = models.ForeignKey(verbose_name = '班主任' ,to = 'UserInfo' ,related_name = 'classes' ,on_delete = models.CASCADE, limit_choices_to = { 'depart__title' : '教质部' }) teach_teacher = models.ManyToManyField(verbose_name = '任课老师' ,to = 'UserInfo' ,related_name = 'teach_classes' ,blank = True , limit_choices_to = { 'depart__title__in' :[ 'Linux教学部' , 'Python教学部' ]}) memo = models.TextField(verbose_name = '说明' ,blank = True ,null = True ) def __str__( self ): return "{0}({1}期)" . format ( self .course.name, self .semester) #python全栈1期 class UserInfo(RbacUserInfo): #继承了rbac里面信息表 ''' 员工表 ''' nickname = models.CharField(verbose_name = '姓名' ,max_length = 16 ) phone = models.CharField(verbose_name = '手机号' ,max_length = 32 ) gender_choices = ( ( 1 , '男' ), ( 2 , '女' ), ) gender = models.IntegerField(verbose_name = '性别' ,choices = gender_choices,default = 1 ) depart = models.ForeignKey(verbose_name = '部门' ,to = "Depart" ,on_delete = models.CASCADE) def __str__( self ): return self .nickname |
userinfo表:
depart表:
classlist:
若在models中ClassList定义limit_choices_to,基于ModelForm生成表单,添加操作时会对关联的Fk,M2M进行筛选(不设置,默认是与其关联的UserInfo中所有老师)
1 2 | class_teacher = models.ForeignKey(verbose_name = '班主任' ,to = 'UserInfo' ,related_name = 'classes' ,on_delete = models.CASCADE, limit_choices_to = { 'depart__title' : '教质部' }) #筛选出部门为教质部的老师 |
blank
设置为True时,字段可以为空。设置为False时,字段是必须填写的。字符型字段CharField和TextField是用空字符串来存储空值的。
如果为True,字段允许为空,默认不允许。
null
设置为True时,django用Null来存储空值。日期型、时间型和数字型字段不接受空字符串。所以设置IntegerField,DateTimeField型字段可以为空时,需要将blank,null均设为True。
如果为True,空值将会被存储为NULL,默认为False。
如果想设置BooleanField为空时可以选用NullBooleanField型字段。
一句话概括
- null 是针对数据库而言,如果 null=True, 表示数据库的该字段可以为空。
- blank 是针对表单的,如果 blank=True,表示你的表单填写该字段的时候可以不填,比如 admin 界面下增加 model 一条记录的时候。直观的看到就是该字段不是粗体
参考 https://www.cnblogs.com/pyspark/p/8638180.html
分类:
06-web框架开发
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)