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实现一个简单的MySQL类
Jan 07 Python
Python实现二分法算法实例
Feb 02 Python
Python去除字符串两端空格的方法
May 21 Python
一篇文章入门Python生态系统(Python新手入门指导)
Dec 11 Python
python基于pdfminer库提取pdf文字代码实例
Aug 15 Python
python中68个内置函数的总结与介绍
Feb 24 Python
python实现将两个文件夹合并至另一个文件夹(制作数据集)
Apr 03 Python
Python搭建Keras CNN模型破解网站验证码的实现
Apr 07 Python
在python中修改.properties文件的操作
Apr 08 Python
python 在sql语句中使用%s,%d,%f说明
Jun 06 Python
python 19个值得学习的编程技巧
Aug 15 Python
ubuntu16.04升级Python3.5到Python3.7的方法步骤
Aug 20 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
浅谈php扩展imagick
2014/06/02 PHP
php实现scws中文分词搜索的方法
2015/12/25 PHP
用JavaScript获取网页中的js、css、Flash等文件
2006/12/20 Javascript
JavaScript 权威指南(第四版) 读书笔记
2009/08/11 Javascript
url 编码 js url传参中文乱码解决方案
2010/04/11 Javascript
firefox浏览器不支持innerText的解决方法
2013/08/07 Javascript
javascript设置金额样式转换保留两位小数示例代码
2013/12/04 Javascript
jquery如何根据值设置默认的选中项
2014/03/17 Javascript
js实现键盘控制DIV移动的方法
2015/01/10 Javascript
JS运动基础框架实例分析
2015/03/03 Javascript
JavaScript使用RegExp进行正则匹配的方法
2015/07/11 Javascript
JS日程管理插件FullCalendar简单实例
2017/02/07 Javascript
3分钟掌握常用的JS操作JSON方法总结
2017/04/25 Javascript
JavaScript之面向对象_动力节点Java学院整理
2017/06/29 Javascript
如何解决jQuery 和其他JS库的冲突
2020/06/22 jQuery
Python中关于使用模块的基础知识
2015/05/24 Python
几种实用的pythonic语法实例代码
2018/02/24 Python
使用pandas read_table读取csv文件的方法
2018/07/04 Python
Python2.7环境Flask框架安装简明教程【已测试】
2018/07/13 Python
python 读取dicom文件,生成info.txt和raw文件的方法
2019/01/24 Python
python 实现12bit灰度图像映射到8bit显示的方法
2019/07/08 Python
django框架F&Q 聚合与分组操作示例
2019/12/12 Python
django框架单表操作之增删改实例分析
2019/12/16 Python
Django 如何使用日期时间选择器规范用户的时间输入示例代码详解
2020/05/22 Python
Python 列表中的修改、添加和删除元素的实现
2020/06/11 Python
Python代码执行时间测量模块timeit用法解析
2020/07/01 Python
日本整理专家Marie Kondo的官方在线商店:KonMari
2020/06/29 全球购物
"引用"与指针的区别是什么
2016/09/07 面试题
企业厂长岗位职责
2013/12/17 职场文书
英语自我评价范文
2014/01/24 职场文书
2014年秋季开学典礼主持词
2014/08/02 职场文书
2014年感恩节活动策划方案
2014/10/06 职场文书
加强作风建设工作总结
2014/10/23 职场文书
单位租房协议书样本
2014/10/30 职场文书
开学第一周值周总结
2015/07/16 职场文书
2019年消防宣传标语集锦
2019/11/21 职场文书