中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

django ManyToManyField多對多關系

發布時間:2020-07-23 01:58:44 來源:網絡 閱讀:12124 作者:zenge_blog 欄目:開發技術

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
1


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
1



反向查詢

>>> 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'


























向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

江津市| 汝州市| 张家港市| 贵定县| 崇文区| 卢龙县| 和顺县| 阜平县| 秦安县| 巴南区| 昭通市| 金湖县| 渭源县| 和顺县| 伊宁市| 盘锦市| 惠水县| 城市| 来凤县| 旬邑县| 涿鹿县| 郑州市| 彭山县| 通河县| 潜山县| 佛冈县| 绵竹市| 黄陵县| 合江县| 宜阳县| 溧阳市| 交口县| 湘西| 三原县| 高碑店市| 鸡泽县| 乐都县| 新泰市| 平凉市| 肥东县| 公主岭市|