django ManyToManyField多对多关系的实例详解


Posted in Python onAugust 09, 2019

Django 的 ORM 有多种关系:一对一,多对一,多对多

各自定义的方式为 :

一对一: OneToOneField

多对一: ForeignKey

多对多: ManyToManyField

上边的描述太过数据而缺乏人性化,我们来更人性化一些:

多个属于一个,即 belong to : ForeignKey,多个属于一个

一个有一个,即 has one: OneToOneField

一个有很多个,即 has many: lots of A belong to B 与 B has many A,在建立 ForeignKey 时,另一个表会自动建立对应的关系

一个既有很多个,又属于很多个,即 has many and belong to : ManyToManyField,同样只能在一个model类中说明,关联表会自动建立。

多对多的关系:

举例:现有两张表,user表和group表。user表中的字段有用户名,邮箱,年龄等信息。而group表中有组名信息。我们知道一个用户可以属于多个组,一个组中也可以包含多个用户,所以这两张表的关系就是多对多的关系。

mysite/learn/models.py文件代码

#coding:utf8
from django.db import models

class Group(models.Model):
  Name = models.CharField(max_length=20)
  def __unicode__(self):
    return self.Name
    
    
class User(models.Model):
  Name = models.CharField(max_length=20)
  Email = models.CharField(max_length=50)
  group = models.ManyToManyField(Group,blank=True)
  def __unicode__(self):
    return self.Name
  def group_list(self):
    return ','.join([i.Name for i in self.group.all()])

创建两张表Group和User,Group表中只有组名“Name”这一个字段。而User表中有用户名“Name”,邮箱“Email”,组名“group”三个字段。

在User表中,由于group信息与Group表关联的,所以要在User表中设置

ManyToManyField
def group_list(self):
    return ','.join([i.Name for i in self.group.all()])

定义group_list函数,是为了在后台页面中显示group_list字段信息。group_list是后台页面显示的字段名称。

i.Name for i in self.group.all()

这里Name是Group表中的Name字段,self.group中的group是User表自己的group字段

mysite/admin.py文件中的代码

from django.contrib import admin
from learn.models import *
# Register your models here.

class UserAdmin(admin.ModelAdmin):
  list_display = ['id','Name','Email','group_list']
admin.site.register(User,UserAdmin)

class GroupAdmin(admin.ModelAdmin):
  list_display = ['id','Name']
admin.site.register(Group,GroupAdmin)

访问admin后台管理页面

在group表中创建组

django ManyToManyField多对多关系的实例详解

在user表中创建用户,Group字段选择用户组。

django ManyToManyField多对多关系的实例详解

django ManyToManyField多对多关系的实例详解

仔细看上面的截图,会发现一个问题-->在Group表中只有组名字段,但是看不到每个组中都有哪些用户。而User表中可以看到group_list字段,所以如果希望在Group中显示用户信息,可以仿照User表的做法,mysite/learn/models.py文件代码

#coding:utf8
from django.db import models

class Group(models.Model):
  Name = models.CharField(max_length=20)
  def user_list(self):
    return ','.join([i.Name for i in self.user_set.all()])
  def __unicode__(self):
    return self.Name
class User(models.Model):
  Name = models.CharField(max_length=20)
  Email = models.CharField(max_length=50)
  group = models.ManyToManyField(Group,blank=True)
  def __unicode__(self):
    return self.Name
  def group_list(self):
    return ','.join([i.Name for i in self.group.all()])

django ManyToManyField多对多关系的实例详解

在learn/admin.py文件中加上user_list字段

django ManyToManyField多对多关系的实例详解

再次访问admin后台管理页面,在group表中可以看到user_list信息了。

django ManyToManyField多对多关系的实例详解

正向查询和反向查询

正向查询:

上面我们创建了两张表user和group,现在我想查询user表中某个用户的所属组

进入django shell命令行

python manage.py shell
>>> from learn.models import *
>>> User.objects.all()
[<User: 老黄>, <User: 老张>, <User: 老王>]
>>> User.objects.all()[0]
<User: 老黄>
>>> User.objects.all()[0].Email
u'laohuang@qq.com'
>>> User.objects.all()[0].group.all()
[<Group: CEO>, <Group: COO>]
>>> User.objects.all()[0].group.all()[0].Name
u'CEO'
>>> User.objects.all()[0].group.all()[0].id

mysite/models.py文件中的每一个类都是一个对象,使用

User.objects.all()

可以获取所有对象,它是一个列表

[<User: 老黄>, <User: 老张>, <User: 老王>]

获取第一个对象

>>> User.objects.all()[0]
<User: 老黄>

获取老黄这个对象的邮箱属性的值

>>> User.objects.all()[0].Email
u'laohuang@qq.com'

获取用户所属组的组名,和id

>>> User.objects.all()[0].group.all()[0].Name
u'CEO'
>>> User.objects.all()[0].group.all()[0].id

反向查询:

>>> from learn.models import * ##导入models中所有的类

>>> Group.objects.all()  ##查看Group表中所有的对象
[<Group: CEO>, <Group: CTO>, <Group: COO>, <Group: VP>]

>>> Group.objects.all()[0] ##查看Group表中第一个对象CEO
<Group: CEO>

>>> Group.objects.all()[0].Name ##查看CEO这个对象的Name属性
u'CEO'

>>> Group.objects.all()[0].user_set.all() ##反向查看CEO这个对象的用户名
[<User: 老黄>]

>>> Group.objects.all()[0].user_set.all()[0]
<User: 老黄>

>>> Group.objects.all()[0].user_set.all()[0].Email ##反向查看CEO这个对象的Email
u'laohuang@qq.com'

>>> Group.objects.all()[0].user_set.all()[0].Name 
u'\u8001\u9ec4'

以上这篇django ManyToManyField多对多关系的实例详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
使用python实现扫描端口示例
Mar 29 Python
django多对多表的创建,级联删除及手动创建第三张表
Jul 25 Python
浅谈Python3 numpy.ptp()最大值与最小值的差
Aug 24 Python
Python序列对象与String类型内置方法详解
Oct 22 Python
调用其他python脚本文件里面的类和方法过程解析
Nov 15 Python
基于python实现雪花算法过程详解
Nov 16 Python
PyTorch 解决Dataset和Dataloader遇到的问题
Jan 08 Python
python opencv 实现对图像边缘扩充
Jan 19 Python
PyCharm无法识别PyQt5的2种解决方法,ModuleNotFoundError: No module named 'pyqt5'
Feb 17 Python
使用python实现飞机大战游戏
Mar 23 Python
Selenium alert 弹窗处理的示例代码
Aug 06 Python
python实现自动清理重复文件
Aug 24 Python
python虚拟环境的安装和配置(virtualenv,virtualenvwrapper)
Aug 09 #Python
python实现比对美团接口返回数据和本地mongo数据是否一致示例
Aug 09 #Python
对django2.0 关联表的必填on_delete参数的含义解析
Aug 09 #Python
python实现美团订单推送到测试环境,提供便利操作示例
Aug 09 #Python
正则给header的冒号两边参数添加单引号(Python请求用)
Aug 09 #Python
基于django ManyToMany 使用的注意事项详解
Aug 09 #Python
Django在admin后台集成TinyMCE富文本编辑器的例子
Aug 09 #Python
You might like
php过滤表单提交的html等危险代码
2014/11/03 PHP
PHP使用memcache缓存技术提高响应速度的方法
2014/12/26 PHP
script标签的 charset 属性使用说明
2010/12/04 Javascript
jQuery模拟超链接点击效果代码
2013/04/21 Javascript
js判断页面中是否有指定控件的简单实例
2014/03/04 Javascript
javascript动态判断html元素并执行不同的操作
2014/06/16 Javascript
FF(火狐)浏览器无法执行window.close()解决方案
2014/11/13 Javascript
JavaScript与jQuery实现的闪烁输入效果
2016/02/18 Javascript
简单实现轮播图效果的实例
2016/07/15 Javascript
jQuery实现表格隔行及滑动,点击时变色的方法【测试可用】
2016/08/20 Javascript
jQuery实现动态文字搜索功能
2017/01/05 Javascript
JS动态添加的div点击跳转到另一页面实现代码
2017/09/30 Javascript
利用JavaScript的%做隔行换色的实例
2017/11/25 Javascript
关于vue面试题汇总
2018/03/20 Javascript
浅谈Angular HttpClient简单入门
2018/05/04 Javascript
jquery插件开发模式实例详解
2019/07/20 jQuery
JS表单验证插件之数据与逻辑分离操作实例分析【策略模式】
2020/05/01 Javascript
使用vue引入maptalks地图及聚合效果的实现
2020/08/10 Javascript
vue 表单输入框不支持focus及blur事件的解决方案
2020/11/17 Vue.js
Python设置Socket代理及实现远程摄像头控制的例子
2015/11/13 Python
Python简单格式化时间的方法【strftime函数】
2016/09/18 Python
selenium python浏览器多窗口处理代码示例
2018/01/15 Python
Python3实现的简单验证码识别功能示例
2018/05/02 Python
使用Python将图片转正方形的两种方法实例代码详解
2020/04/29 Python
python如何使用代码运行助手
2020/07/03 Python
Python配置pip国内镜像源的实现
2020/08/20 Python
用python对excel查重
2020/12/07 Python
Canvas实现保存图片到本地的示例代码
2018/06/28 HTML / CSS
世界领先的艺术图书出版社:TASCHEN
2018/07/23 全球购物
校长岗位职责
2013/11/26 职场文书
初一生物教学反思
2014/01/18 职场文书
先进典型发言材料
2014/12/30 职场文书
市场营销计划书
2015/01/17 职场文书
2016十一国庆节慰问信
2015/12/01 职场文书
OpenCV实现常见的四种图像几何变换
2022/04/01 Python
Spring IOC容器Bean的作用域及生命周期实例
2022/05/30 Java/Android