欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

django ManyToManyField多對(duì)多關(guān)系的實(shí)例詳解

 更新時(shí)間:2019年08月09日 09:39:10   作者:zenge_blog  
今天小編就為大家分享一篇django ManyToManyField多對(duì)多關(guān)系的實(shí)例詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

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表中的字段有用戶(hù)名,郵箱,年齡等信息。而group表中有組名信息。我們知道一個(gè)用戶(hù)可以屬于多個(gè)組,一個(gè)組中也可以包含多個(gè)用戶(hù),所以這兩張表的關(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表中有用戶(hù)名“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)

訪(fǎng)問(wèn)admin后臺(tái)管理頁(yè)面

在group表中創(chuàng)建組

在user表中創(chuàng)建用戶(hù),Group字段選擇用戶(hù)組。

仔細(xì)看上面的截圖,會(huì)發(fā)現(xiàn)一個(gè)問(wèn)題-->在Group表中只有組名字段,但是看不到每個(gè)組中都有哪些用戶(hù)。而User表中可以看到group_list字段,所以如果希望在Group中顯示用戶(hù)信息,可以仿照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字段

再次訪(fǎng)問(wèn)admin后臺(tái)管理頁(yè)面,在group表中可以看到user_list信息了。

正向查詢(xún)和反向查詢(xún)

正向查詢(xún):

上面我們創(chuàng)建了兩張表user和group,現(xiàn)在我想查詢(xún)user表中某個(gè)用戶(hù)的所屬組

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

獲取用戶(hù)所屬組的組名,和id

>>> User.objects.all()[0].group.all()[0].Name
u'CEO'
>>> User.objects.all()[0].group.all()[0].id

反向查詢(xún):

>>> 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ì)象的用戶(hù)名
[<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è)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • plt.title()中文無(wú)法顯示的問(wèn)題解決

    plt.title()中文無(wú)法顯示的問(wèn)題解決

    本文主要介紹了plt.title()中文無(wú)法顯示的問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • python實(shí)現(xiàn)發(fā)送郵件功能

    python實(shí)現(xiàn)發(fā)送郵件功能

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)發(fā)送郵件功能,使用的模塊是smtplib、MIMEText,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Python 搭建Web站點(diǎn)之Web服務(wù)器網(wǎng)關(guān)接口

    Python 搭建Web站點(diǎn)之Web服務(wù)器網(wǎng)關(guān)接口

    本文是Python 搭建Web站點(diǎn)系列文章的第二篇,接上文,主要給大家來(lái)講述Web服務(wù)器網(wǎng)關(guān)接口WSGI的相關(guān)資料,非常詳細(xì),有需要的小伙伴可以參考下
    2016-11-11
  • python+Django實(shí)現(xiàn)防止SQL注入的辦法

    python+Django實(shí)現(xiàn)防止SQL注入的辦法

    這篇文章主要介紹了python+Django實(shí)現(xiàn)防止SQL注入的辦法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • python代碼能做成軟件嗎

    python代碼能做成軟件嗎

    在本篇內(nèi)容里小編給大家分享的是一篇關(guān)于把python代碼做成軟件的方法,有興趣的朋友們可以閱讀下。
    2020-07-07
  • python調(diào)用tcpdump抓包過(guò)濾的方法

    python調(diào)用tcpdump抓包過(guò)濾的方法

    這篇文章主要為大家詳細(xì)介紹了python調(diào)用tcpdump抓包過(guò)濾的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • python?中的jieba分詞庫(kù)

    python?中的jieba分詞庫(kù)

    這篇文章主要介紹了python中的jieba分詞庫(kù),jieba?庫(kù)是優(yōu)秀的中文分詞第三方庫(kù),中文文本需要通過(guò)分詞獲得單個(gè)的詞語(yǔ),下面文章的的詳細(xì)內(nèi)容,需要的朋友可以參考一下
    2021-11-11
  • 在pycharm下設(shè)置自己的個(gè)性模版方法

    在pycharm下設(shè)置自己的個(gè)性模版方法

    今天小編就為大家分享一篇在pycharm下設(shè)置自己的個(gè)性模版方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-07-07
  • 淺談django url請(qǐng)求與數(shù)據(jù)庫(kù)連接池的共享問(wèn)題

    淺談django url請(qǐng)求與數(shù)據(jù)庫(kù)連接池的共享問(wèn)題

    今天小編就為大家分享一篇淺談django url請(qǐng)求與數(shù)據(jù)庫(kù)連接池的共享問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-08-08
  • python matplotlib繪圖實(shí)現(xiàn)刪除重復(fù)冗余圖例的操作

    python matplotlib繪圖實(shí)現(xiàn)刪除重復(fù)冗余圖例的操作

    這篇文章主要介紹了python matplotlib繪圖實(shí)現(xiàn)刪除重復(fù)冗余圖例的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04

最新評(píng)論