django数据关系一对多、多对多模型、自关联的建立


Posted in Python onJuly 24, 2019

一对多模型

一对多的关系,例如员工跟部门。一个部门有多个员工。那么在django怎么建立这种表关系呢?

其实就是利用外键,在多的一方,字段指定外键即可。例如员工和部门,员工是多,所以在员工表直接部门即可。

示例(见19行):

class Department(models.Model):
  name = models.CharField(max_length=20)
  create_data = models.DateField(auto_now_add=True)
  is_delete = models.BooleanField(default=False)

  class Meta:
    db_table = "department"


class Employee(models.Model):
  name = models.CharField(max_length=20)
  age = models.IntegerField()
  gender = models.IntegerField(default=0)
  # decimal_place = 2表示两位小数,max_digits表示8个数字,包括小数的两位
  salary = models.DecimalField(max_digits=8,decimal_places=2)
  # null=True 表示可以为空,blank=True表示django后台管理输入这个字段可以为空
  comment = models.CharField(max_length=300,null=True,blank=True)
  hire_data = models.DateField(auto_now_add=True)
  department = models.ForeignKey("Department")

  class Meta:
    db_table = "employee"

拓展:

1.在设置外键时,需要通过on_delete选项指明主表删除数据时,对于外键引用表数据如何处理,在django.db.models中包含了可选常量:

关联属性on_delete选项的取值

  • models.CASCADE 此为默认值,级联删除,会删除关联数据
department = models.ForeignKey('Department', on_delete=models.CASCADE)
  • models.PROTECT 只要存在关联数据就不能删除
department = models.ForeignKey('Department', on_delete=models.PROTECT)
  • models.SET_NULL 删除数据后关联字段设置为NULL,仅在该字段允许为null时可用(null=True)

2.如果关联的字段不在该应用文件夹的model.py中,那么要写成这样

department = models.ForeignKey("(应用文件夹名).Department")

还有一个需要特别注意:

department = models.ForeignKey("Department",related_name='employee')时,通过部门查找员工的是用employee。如果不设置的话,是用默认的employee_set(类名的小写+_set)

一对多的查询:

一个员工所属的部门(查出来的是对象):

a = Employee.objects.get(id=1)
b = a.department

一个部门的全部员工(查出来的是对象):

a = Department.objects.get(id=1)
b = a.employee_set.all()

多对多模型

多对多的关系,例如学生与社团。一个学生可以进多个社团,一个社团可以有多个学生。那么在django怎么建立这种表关系呢?

django建立多对多关系有两种方法。

方法一:

class Student(models.Model):
  name= models.CharField(max_length=16)
  birthday=models.DateField()
class Club(models.Model):
  name= models.CharField(max_length=16)
  members = models.ManyToManyField("Student")

只需要在任意一方加上类似第6行的ManyToManyField就可以了。Django会自动为多对多关联关系创建一张表,用于两张表的联系。

那么查询呢?

1.一个社团的全部成员(查出来的是对象)

c = Club.objects.get(id=1)
c.members.all()

2.一个成员的全部社团(查出来的是对象)

s = Student.objects.filter(id=1)
s.club_set.all() # 类名的小写+_set

方法二:(比较灵活)

自己手动建立一张表关联联系。

class Student(models.Model):
  name= models.CharField(max_length=16)
  birthday=models.DateField()

class Club(models.Model):
  name= models.CharField(max_length=16)

class Membership(models.Model):
  student = models.ForeignKey("Student")
  club = models.ForeignKey("Club")

那么这种方式建表怎么查询呢?

一个学生加入的全部社团:

a = Student.objects.get(id=1)
b = a.membership_set.all() # 查出来的是对象
for i in b:
  print(i.club.name)

一个社团的全部学生:

a = Club.objects.get(id=1)
b = a.membership_set.all() # 查出来的是对象
for i in b:
  print(i.student.name)

自关联模型

自关联模型,就是表中的某一列,关联了这个表中的另外一列。最典型的自关联模型就是地区表。省、市、县都在一张表里面。省的pid为null,市的pid为省的id,县的pid为市的id。

示例:

class Area(models.Model):  
    name = models.CharField(max_length=20, verbose_name='名称')
    # 自关联(特殊的一对多): 生成的字段名 parent_id
    parent = models.ForeignKey('self', verbose_name='上级行政区划')
    class Meta:
      db_table = 'tb_areas'
      verbose_name = '行政区划'

那么,怎么查询呢?

如果知道一个市,叫a市,想查他属于什么省。

a = Area.objects.get(id=1)
# b就是a市的省份的对象
b = a.parent

如果知道一个省,叫a省,想查他有什么市。

a = Area.object.get(id=1)
# b就是a省的全部市的对象
b = a.area_set.all() #类名小写+'_set'

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python生成随机验证码(中文验证码)示例
Apr 03 Python
Python类属性与实例属性用法分析
May 09 Python
简单总结Python中序列与字典的相同和不同之处
Jan 19 Python
Python内置函数OCT详解
Nov 09 Python
Python向Excel中插入图片的简单实现方法
Apr 24 Python
PyQt5的安装配置过程,将ui文件转为py文件后显示窗口的实例
Jun 19 Python
Python 如何提高元组的可读性
Aug 26 Python
flask框架自定义过滤器示例【markdown文件读取和展示功能】
Nov 08 Python
spyder 在控制台(console)执行python文件,debug python程序方式
Apr 20 Python
python+requests接口自动化框架的实现
Aug 31 Python
Python 多线程C段扫描、检测 Ping扫描脚本的实现
Sep 03 Python
python lambda的使用详解
Feb 26 Python
django如何自己创建一个中间件
Jul 24 #Python
django如何通过类视图使用装饰器
Jul 24 #Python
django 类视图的使用方法详解
Jul 24 #Python
django如何实现视图重定向
Jul 24 #Python
python字符串分割及字符串的一些常规方法
Jul 24 #Python
django使用haystack调用Elasticsearch实现索引搜索
Jul 24 #Python
python 判断三个数字中的最大值实例代码
Jul 24 #Python
You might like
在smarty模板中使用PHP函数的方法
2011/04/23 PHP
PHP中加速、缓存扩展的区别和作用详解(eAccelerator、memcached、xcache、APC )
2016/07/09 PHP
php生成毫秒时间戳的实例讲解
2017/09/22 PHP
PHP排序算法之归并排序(Merging Sort)实例详解
2018/04/21 PHP
js中iframe调用父页面的方法
2014/10/30 Javascript
jquery插件推荐浏览器嗅探userAgent
2014/11/09 Javascript
js中实现字符串和数组的相互转化详解
2016/01/24 Javascript
Angular发布1.5正式版,专注于向Angular 2的过渡
2016/02/18 Javascript
JS及PHP代码编写八大排序算法
2016/07/12 Javascript
Angularjs结合Bootstrap制作的一个TODO List
2016/08/18 Javascript
javascript 动态样式添加的简单实现
2016/10/11 Javascript
jquery实现弹窗功能(窗口居中显示)
2017/02/27 Javascript
解析Vue 2.5的Diff算法
2017/11/28 Javascript
js实现点击按钮复制文本功能
2020/07/20 Javascript
VUE 配置vue-devtools调试工具及安装方法
2018/09/30 Javascript
JS实现动态倒计时功能(天数、时、分、秒)
2019/12/12 Javascript
微信小程序入门之绘制时钟
2020/10/22 Javascript
[57:47]Fnatic vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python类的定义、继承及类对象使用方法简明教程
2015/05/08 Python
使用Python脚本将文字转换为图片的实例分享
2015/08/29 Python
三步实现Django Paginator分页的方法
2019/06/11 Python
如何在python中写hive脚本
2019/11/08 Python
pandas抽取行列数据的几种方法
2020/12/13 Python
Hunter Boots美国官方网站:赫特威灵顿雨靴
2018/06/16 全球购物
档案接收函范文
2014/01/10 职场文书
安全检查验收制度
2014/01/12 职场文书
生日邀请函范文
2014/01/13 职场文书
艺术学院毕业生自我评价
2014/03/02 职场文书
人事部经理岗位职责
2014/03/07 职场文书
小学端午节活动方案
2014/03/13 职场文书
关于保护环境的标语
2014/06/09 职场文书
食品安全汇报材料
2014/08/18 职场文书
党校学习个人总结
2015/02/15 职场文书
幼儿园国培研修日志
2015/11/13 职场文书
详解Python魔法方法之描述符类
2021/05/26 Python
Python中requests库的用法详解
2022/06/05 Python