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 相关文章推荐
精确查找PHP WEBSHELL木马的方法(1)
Apr 12 Python
Python爬取京东的商品分类与链接
Aug 26 Python
selenium+python截图不成功的解决方法
Jan 30 Python
解决Pandas的DataFrame输出截断和省略的问题
Feb 08 Python
pyqt5 键盘监听按下enter 就登陆的实例
Jun 25 Python
Django高级编程之自定义Field实现多语言
Jul 02 Python
python flask 如何修改默认端口号的方法步骤
Jul 12 Python
基于python实现自动化办公学习笔记(CSV、word、Excel、PPT)
Aug 06 Python
Pytorch之卷积层的使用详解
Dec 31 Python
Python SSL证书验证问题解决方案
Jan 13 Python
Pytorch maxpool的ceil_mode用法
Feb 18 Python
Pyecharts地图显示不完成问题解决方案
May 11 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实现定时生成HTML网站首页实例代码
2008/11/20 PHP
PHP版网站缓存加快打开速度的方法分享
2012/06/03 PHP
php数组添加与删除单元的常用函数实例分析
2015/02/16 PHP
PHP获取HTTP body内容的方法
2018/12/31 PHP
js验证表单大全
2006/11/25 Javascript
JQuery EasyUI 对话框的使用方法
2010/10/24 Javascript
jQuery timers计时器简单应用说明
2010/10/28 Javascript
Js数组的操作push,pop,shift,unshift等方法详细介绍
2012/12/28 Javascript
setTimeout()与setInterval()方法区别介绍
2013/12/24 Javascript
jquery禁用右键示例
2014/04/28 Javascript
js实现按Ctrl+Enter发送效果
2014/09/18 Javascript
jQuery中delegate()方法用法实例
2015/01/19 Javascript
javascript遇到html5的一些表单属性
2015/07/05 Javascript
用JavaScript实现PHP的urlencode与urldecode函数
2015/08/13 Javascript
JavaScript编程中布尔对象的基本使用
2015/10/25 Javascript
详解JavaScript对象和数组
2015/12/03 Javascript
javascript简单进制转换实现方法
2016/11/24 Javascript
vue-router路由简单案例介绍
2017/02/21 Javascript
javascript兼容性(实例讲解)
2017/08/15 Javascript
jQuery实现浏览器之间跳转并传递参数功能【支持中文字符】
2018/03/28 jQuery
vue实现图片懒加载的方法分析
2020/02/05 Javascript
JS可断点续传文件上传实现代码解析
2020/07/30 Javascript
python多线程用法实例详解
2015/01/15 Python
python 链接和操作 memcache方法
2017/03/04 Python
python实现随机漫步算法
2018/08/27 Python
python 函数中的参数类型
2020/02/11 Python
tensorflow基于CNN实战mnist手写识别(小白必看)
2020/07/20 Python
纯CSS3代码实现switch滑动开关按钮效果
2016/08/30 HTML / CSS
孕妇内衣和胸罩:Cake Maternity
2018/07/16 全球购物
高级护理专业大学生求职信
2013/10/24 职场文书
计算机专业优秀大学生自我总结
2014/01/21 职场文书
募捐倡议书
2014/04/14 职场文书
12岁生日演讲稿
2014/05/14 职场文书
一份关于丢失公司财物的检讨书
2014/09/19 职场文书
2015年依法行政工作总结
2015/04/29 职场文书
JS数组去重详情
2021/11/07 Javascript