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中copy()方法的使用
May 21 Python
python实现判断数组是否包含指定元素的方法
Jul 15 Python
Python生成短uuid的方法实例详解
May 29 Python
python之Flask实现简单登录功能的示例代码
Dec 24 Python
tensorflow多维张量计算实例
Feb 11 Python
Python爬虫爬取新闻资讯案例详解
Jul 14 Python
Pygame框架实现飞机大战
Aug 07 Python
pymysql模块使用简介与示例
Nov 17 Python
Django-silk性能测试工具安装及使用解析
Nov 28 Python
python3实现名片管理系统(控制台版)
Nov 29 Python
Python之字符串的遍历的4种方式
Dec 08 Python
python 实现定时任务的四种方式
Apr 01 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
全国FM电台频率大全 - 25 云南省
2020/03/11 无线电
PHP运行时强制显示出错信息的代码
2011/04/20 PHP
PHP生成验证码时“图像因其本身有错无法显示”的解决方法
2013/08/07 PHP
php生成扇形比例图实例
2013/11/06 PHP
详解php的socket通信
2015/08/11 PHP
jQuery向下滚动即时加载内容实现的瀑布流效果
2016/01/07 PHP
VBScript版代码高亮
2006/06/26 Javascript
JQuery的一些小应用收集
2010/03/27 Javascript
js实现一个省市区三级联动选择框代码分享
2013/03/06 Javascript
DIV+CSS+JS不间断横向滚动实现代码
2013/03/19 Javascript
JS实现一键回顶功能示例代码
2013/10/28 Javascript
jQuery实现下拉框功能实例代码
2016/05/06 Javascript
chrome下判断点击input上标签还是其余标签的实现方法
2016/09/18 Javascript
用js将long型数据转换成date型或datetime型的实例
2017/07/03 Javascript
JS实现table表格固定表头且表头随横向滚动而滚动
2017/10/26 Javascript
详解处理Vue单页面应用SEO的另一种思路
2018/11/09 Javascript
Vue源码之关于vm.$delete()/Vue.use()内部原理详解
2019/05/01 Javascript
基于vue+axios+lrz.js微信端图片压缩上传方法
2019/06/25 Javascript
layui实现数据表格自定义数据项
2019/10/26 Javascript
[02:19]DOTA2女子战队FOX视频专访:希望更多美眉一起加入
2013/10/15 DOTA
[42:24]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第三场 11.27
2020/12/01 DOTA
python中通过预先编译正则表达式提高效率
2017/09/25 Python
python正则实现提取电话功能
2018/02/24 Python
python编写弹球游戏的实现代码
2018/03/12 Python
python使用wxpy实现微信消息防撤回脚本
2019/04/29 Python
Win10下用Anaconda安装TensorFlow(图文教程)
2020/06/18 Python
python使用建议与技巧分享(二)
2020/08/17 Python
numpy实现RNN原理实现
2021/03/02 Python
一款纯css3实现的非常实用的鼠标悬停特效演示
2014/11/05 HTML / CSS
办理居住证介绍信
2014/01/15 职场文书
高中升旗仪式演讲稿
2014/09/09 职场文书
公司党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
领导干部四风问题自我剖析材料
2014/09/25 职场文书
党员检讨书
2014/10/13 职场文书
同学毕业留言寄语
2015/02/27 职场文书
写作技巧:如何撰写商业计划书
2019/08/08 职场文书