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实现DNS正向查询、反向查询的例子
Apr 25 Python
python实现的重启关机程序实例
Aug 21 Python
Python提取Linux内核源代码的目录结构实现方法
Jun 24 Python
从零开始学Python第八周:详解网络编程基础(socket)
Dec 14 Python
Python request设置HTTPS代理代码解析
Feb 12 Python
Python过滤txt文件内重复内容的方法
Oct 21 Python
Scrapy框架爬取Boss直聘网Python职位信息的源码
Feb 22 Python
Python实现的旋转数组功能算法示例
Feb 23 Python
keras获得某一层或者某层权重的输出实例
Jan 24 Python
Python如何创建装饰器时保留函数元信息
Aug 07 Python
Django权限控制的使用
Jan 07 Python
python中Pyqt5使用Qlabel标签播放视频
Apr 22 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 strtr() 函数使用说明
2008/11/21 PHP
PHP序列号生成函数和字符串替换函数代码
2012/06/07 PHP
codeigniter中测试通过的分页类示例
2014/04/17 PHP
php使用SAE原生Mail类实现各种类型邮件发送的方法
2016/10/10 PHP
Thinkphp5框架实现获取数据库数据到视图的方法
2019/08/14 PHP
脚本吧 - 幻宇工作室用到js,超强推荐base.js
2006/12/23 Javascript
用JavaScript实现UrlEncode和UrlDecode的脚本代码
2008/07/23 Javascript
javascript 去字符串空格终极版(支持utf8)
2009/11/14 Javascript
javaScript对文字按照拼音排序实现代码
2013/12/27 Javascript
jQuery mobile 移动web(6)
2015/12/20 Javascript
jQuery实现多级联动下拉列表查询框
2016/01/18 Javascript
jquery+ajax实现直接提交表单实例分析
2016/06/17 Javascript
jquery插件autocomplete用法示例
2016/07/01 Javascript
利用jQuery插件imgAreaSelect实现图片上传裁剪(放大缩小)
2016/12/02 Javascript
浅谈webpack 自动刷新与解析
2018/04/09 Javascript
JS实现二维数组元素的排列组合运算简单示例
2019/01/28 Javascript
p5.js临摹旋转爱心
2019/10/23 Javascript
jquery实现简易验证插件封装
2020/09/13 jQuery
详解vue 中 scoped 样式作用域的规则
2020/09/14 Javascript
js 实现碰撞检测的示例
2020/10/28 Javascript
Python列表推导式的使用方法
2013/11/21 Python
Python3爬虫使用Fidder实现APP爬取示例
2018/11/27 Python
python 实现在一张图中绘制一个小的子图方法
2019/07/07 Python
对Django 转发和重定向的实例详解
2019/08/06 Python
python函数修饰符@的使用方法解析
2019/09/02 Python
在Pytorch中计算自己模型的FLOPs方式
2019/12/30 Python
OpenCV实现机器人对物体进行移动跟随的方法实例
2020/11/09 Python
css3学习系列之移动属性详解
2017/07/04 HTML / CSS
毕业生个人求职信范例分享
2013/12/17 职场文书
本科生职业生涯规划书范文
2014/01/21 职场文书
教育技术职业规划范文
2014/03/04 职场文书
校园学雷锋活动月总结
2014/03/09 职场文书
反洗钱宣传活动总结
2014/08/26 职场文书
预备党员期盼十八届四中全会召开思想汇报
2014/10/17 职场文书
2015年基层党支部工作总结
2015/05/21 职场文书
浅谈什么是SpringBoot异常处理自动配置的原理
2021/06/21 Java/Android