django ManyToManyField多對(duì)多關(guān)系的實(shí)例詳解
Django 的 ORM 有多種關(guān)系:一對(duì)一,多對(duì)一,多對(duì)多
各自定義的方式為 :
一對(duì)一: OneToOneField
多對(duì)一: ForeignKey
多對(duì)多: ManyToManyField
上邊的描述太過(guò)數(shù)據(jù)而缺乏人性化,我們來(lái)更人性化一些:
多個(gè)屬于一個(gè),即 belong to : ForeignKey,多個(gè)屬于一個(gè)
一個(gè)有一個(gè),即 has one: OneToOneField
一個(gè)有很多個(gè),即 has many: lots of A belong to B 與 B has many A,在建立 ForeignKey 時(shí),另一個(gè)表會(huì)自動(dòng)建立對(duì)應(yīng)的關(guān)系
一個(gè)既有很多個(gè),又屬于很多個(gè),即 has many and belong to : ManyToManyField,同樣只能在一個(gè)model類(lèi)中說(shuō)明,關(guān)聯(lián)表會(huì)自動(dòng)建立。
多對(duì)多的關(guān)系:
舉例:現(xiàn)有兩張表,user表和group表。user表中的字段有用戶名,郵箱,年齡等信息。而group表中有組名信息。我們知道一個(gè)用戶可以屬于多個(gè)組,一個(gè)組中也可以包含多個(gè)用戶,所以這兩張表的關(guān)系就是多對(duì)多的關(guān)系。
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()])
創(chuàng)建兩張表Group和User,Group表中只有組名“Name”這一個(gè)字段。而User表中有用戶名“Name”,郵箱“Email”,組名“group”三個(gè)字段。
在User表中,由于group信息與Group表關(guān)聯(lián)的,所以要在User表中設(shè)置
ManyToManyField
def group_list(self): return ','.join([i.Name for i in self.group.all()])
定義group_list函數(shù),是為了在后臺(tái)頁(yè)面中顯示group_list字段信息。group_list是后臺(tái)頁(yè)面顯示的字段名稱(chēng)。
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)
訪問(wèn)admin后臺(tái)管理頁(yè)面
在group表中創(chuàng)建組
在user表中創(chuàng)建用戶,Group字段選擇用戶組。
仔細(xì)看上面的截圖,會(huì)發(fā)現(xiàn)一個(gè)問(wèn)題-->在Group表中只有組名字段,但是看不到每個(gè)組中都有哪些用戶。而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()])
在learn/admin.py文件中加上user_list字段
再次訪問(wèn)admin后臺(tái)管理頁(yè)面,在group表中可以看到user_list信息了。
正向查詢和反向查詢
正向查詢:
上面我們創(chuàng)建了兩張表user和group,現(xiàn)在我想查詢user表中某個(gè)用戶的所屬組
進(jìn)入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文件中的每一個(gè)類(lèi)都是一個(gè)對(duì)象,使用
User.objects.all()
可以獲取所有對(duì)象,它是一個(gè)列表
[<User: 老黃>, <User: 老張>, <User: 老王>]
獲取第一個(gè)對(duì)象
>>> User.objects.all()[0] <User: 老黃>
獲取老黃這個(gè)對(duì)象的郵箱屬性的值
>>> 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 * ##導(dǎo)入models中所有的類(lèi) >>> Group.objects.all() ##查看Group表中所有的對(duì)象 [<Group: CEO>, <Group: CTO>, <Group: COO>, <Group: VP>] >>> Group.objects.all()[0] ##查看Group表中第一個(gè)對(duì)象CEO <Group: CEO> >>> Group.objects.all()[0].Name ##查看CEO這個(gè)對(duì)象的Name屬性 u'CEO' >>> Group.objects.all()[0].user_set.all() ##反向查看CEO這個(gè)對(duì)象的用戶名 [<User: 老黃>] >>> Group.objects.all()[0].user_set.all()[0] <User: 老黃> >>> Group.objects.all()[0].user_set.all()[0].Email ##反向查看CEO這個(gè)對(duì)象的Email u'laohuang@qq.com' >>> Group.objects.all()[0].user_set.all()[0].Name u'\u8001\u9ec4'
以上這篇django ManyToManyField多對(duì)多關(guān)系的實(shí)例詳解就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- django數(shù)據(jù)關(guān)系一對(duì)多、多對(duì)多模型、自關(guān)聯(lián)的建立
- Django之多對(duì)多查詢與操作方法詳解
- Django 多對(duì)多字段的更新和插入數(shù)據(jù)實(shí)例
- Django中數(shù)據(jù)庫(kù)的數(shù)據(jù)關(guān)系:一對(duì)一,一對(duì)多,多對(duì)多
- 基于Django ORM、一對(duì)一、一對(duì)多、多對(duì)多的全面講解
- Django 標(biāo)簽篩選的實(shí)現(xiàn)代碼(一對(duì)多、多對(duì)多)
- django 多對(duì)多表的創(chuàng)建和插入代碼實(shí)現(xiàn)
- Django Xadmin多對(duì)多字段過(guò)濾實(shí)例
- Django中多對(duì)多關(guān)系三種定義方式
相關(guān)文章
pandas中實(shí)現(xiàn)將相同ID的字符串進(jìn)行合并
這篇文章主要介紹了pandas中實(shí)現(xiàn)將相同ID的字符串進(jìn)行合并問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02python創(chuàng)建ArcGIS shape文件的實(shí)現(xiàn)
今天小編就為大家分享一篇python創(chuàng)建ArcGIS shape文件的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12Python 保持登錄狀態(tài)進(jìn)行接口測(cè)試的方法示例
這篇文章主要介紹了Python 保持登錄狀態(tài)進(jìn)行接口測(cè)試的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-08-08Python查看Tensor尺寸及查看數(shù)據(jù)類(lèi)型的實(shí)現(xiàn)
這篇文章主要介紹了Python查看Tensor尺寸及查看數(shù)據(jù)類(lèi)型的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07python如何求取指定范圍內(nèi)的質(zhì)數(shù)
這篇文章主要介紹了python如何求取指定范圍內(nèi)的質(zhì)數(shù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08