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 相关文章推荐
Django在win10下的安装并创建工程
Nov 20 Python
详解Python中 sys.argv[]的用法简明解释
Dec 20 Python
python实现数据预处理之填充缺失值的示例
Dec 22 Python
tensorflow更改变量的值实例
Jul 30 Python
使用memory_profiler监测python代码运行时内存消耗方法
Dec 03 Python
详解Python学习之安装pandas
Apr 16 Python
Python循环实现n的全排列功能
Sep 16 Python
python模块常用用法实例详解
Oct 17 Python
Python通过Manager方式实现多个无关联进程共享数据的实现
Nov 07 Python
python列表切片和嵌套列表取值操作详解
Feb 27 Python
keras打印loss对权重的导数方式
Jun 10 Python
pycharm配置QtDesigner的超详细方法
Jan 25 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中改变图片的尺寸大小的代码
2011/07/17 PHP
php实现按指定大小等比缩放生成上传图片缩略图的方法
2014/12/15 PHP
php为字符串前后添加指定数量字符的方法
2015/05/04 PHP
php中分页及SqlHelper类用法实例
2017/01/12 PHP
PHP的mysqli_stmt_init()函数讲解
2019/01/24 PHP
javascript 客户端验证上传图片的大小(兼容IE和火狐)
2009/08/15 Javascript
Javacript实现颜色梯度变化和渐变的效果代码
2013/05/31 Javascript
JavaScript中具名函数的多种调用方式总结
2014/11/08 Javascript
js removeChild 方法深入理解
2016/08/16 Javascript
Bootstrap栅格系统使用方法及页面调整变形的解决方法
2017/03/10 Javascript
微信小程序教程系列之设置标题栏和导航栏(7)
2020/06/29 Javascript
详解vue 模版组件的三种用法
2017/07/21 Javascript
jQueryUI Sortable 应用Demo(分享)
2017/09/07 jQuery
详解关于Vue单元测试的几个坑
2020/04/26 Javascript
[53:23]Secret vs Liquid 2018国际邀请赛淘汰赛BO3 第二场 8.25
2018/08/29 DOTA
python类继承用法实例分析
2015/05/27 Python
如何准确判断请求是搜索引擎爬虫(蜘蛛)发出的请求
2015/10/13 Python
python操作redis方法总结
2018/06/06 Python
Python3单行定义多个变量或赋值方法
2018/07/12 Python
Python后台管理员管理前台会员信息的讲解
2019/01/28 Python
关于python导入模块import与常见的模块详解
2019/08/28 Python
Python中base64与xml取值结合问题
2019/12/22 Python
Python批量将图片灰度化的实现代码
2020/04/11 Python
浅谈keras中自定义二分类任务评价指标metrics的方法以及代码
2020/06/11 Python
Python grpc超时机制代码示例
2020/09/14 Python
纯CSS3实现表单验证效果(非常不错)
2017/01/18 HTML / CSS
eBay英国购物网站:eBay.co.uk
2019/06/19 全球购物
怎样让char类型的东西转换成int类型
2013/12/09 面试题
儿媳婚宴答谢词
2014/01/14 职场文书
运动会跳远加油稿
2014/02/20 职场文书
高二学生评语大全
2014/04/25 职场文书
实习推荐信
2014/05/10 职场文书
基层党建工作宣传标语
2014/06/24 职场文书
学校党的群众路线教育实践活动整改措施
2014/10/25 职场文书
大学生暑期社会实践的个人总结!
2019/07/17 职场文书
Python+Selenium自动化环境搭建与操作基础详解
2022/03/13 Python