大家在搭建網(wǎng)站時(shí),無(wú)可避免的必須設(shè)計(jì)方案完成頁(yè)面的用戶系統(tǒng),我們應(yīng)該完成包含新用戶注冊(cè)、賬號(hào)登錄、用戶認(rèn)證、銷(xiāo)戶等服務(wù),Django做為完美主義者最終架構(gòu),它默認(rèn)設(shè)置使用auth_user表來(lái)存儲(chǔ)用戶數(shù)據(jù)信息,下面我們就來(lái)看看Django多對(duì)多使用through自定中間表
多對(duì)多中間表詳細(xì)說(shuō)明
眾所周知針對(duì)ManyToMany字段,Django使用的是下一張中間表的形式。依據(jù)這下一張表,來(lái)關(guān)聯(lián)ManyToMany的彼此。下面我們就依據(jù)1個(gè)實(shí)際的事例,詳細(xì)解說(shuō)中間表的應(yīng)用。
默認(rèn)設(shè)置中間表
class Person(models.Model): name=models.CharField(max_length=128) def __str__(self): return self.name class Group(models.Model): name=models.CharField(max_length=128) members=models.ManyToManyField(Person) def __str__(self): return self.name
在Group模型中,依據(jù)members字段,以ManyToMany的方式和Person建立模型了關(guān)聯(lián)。
讓我們一起來(lái)看看,中間表是一個(gè)什么樣:
最先有某列id,這也是Django默認(rèn)設(shè)置使用的,沒(méi)什么可說(shuō)的。然后就是Group和Person的id列,這也是默認(rèn)設(shè)置前提下,Django關(guān)聯(lián)二張表中方法。如果你想要設(shè)定關(guān)聯(lián)列,能使用to_field主要參數(shù)。
由此可見(jiàn)在中間表中,并不是將二張表中數(shù)據(jù)儲(chǔ)存在一塊,而是用id的關(guān)聯(lián)開(kāi)展投射。
依據(jù)through自定中間表
一般情況下,普通多對(duì)多早已足夠,不用自身建立下一張關(guān)系圖。不過(guò)一些狀況很有可能更加復(fù)雜一點(diǎn)兒,例如如果你想要儲(chǔ)存某些人添加某一分類的時(shí)長(zhǎng)?想儲(chǔ)存接戲的原因吧?
Django帶來(lái)了一個(gè)through參數(shù),用以特定正中間實(shí)體模型,你能將類似接戲時(shí)長(zhǎng),邀約緣故等其它字段名放到這一正中間實(shí)體模型內(nèi)。事例如下所示:
modle:
from django.db import models class Person(models.Model): name=models.CharField(max_length=128) def __str__(self): return self.name class Group(models.Model): name=models.CharField(max_length=128) members=models.ManyToManyField(Person,through='Membership') def __str__(self): return self.name class Membership(models.Model): person=models.ForeignKey(Person,on_delete=models.CASCADE) group=models.ForeignKey(Group,on_delete=models.CASCADE) date_joined=models.DateField()#進(jìn)組時(shí)間 invite_reason=models.CharField(max_length=64)#邀請(qǐng)?jiān)?/pre>
view:
class PersonViews(ModelViewSet): queryset=Person.objects.filter() serializer_class=PersonSerializers class GroupViews(ModelViewSet): queryset=Group.objects.filter() serializer_class=GroupSerializers class MembershipViews(ModelViewSet): queryset=Membership.objects.filter() serializer_class=MembershipSerializers
serializer:
from.models import Person,Group,Membership class MembershipSerializers(serializers.ModelSerializer): class Meta: model=Membership fields='__all__' class PersonSerializers(serializers.ModelSerializer): class Meta: model=Person fields='__all__' class GroupSerializers(serializers.ModelSerializer): def to_representation(self,instance): representation=super(GroupSerializers,self).to_representation(instance) representation['members']=[] for i in PersonSerializers(instance.members,many=True).data: reason=MembershipSerializers(instance.membership_set.get(group=instance.id,person=i['id'])).data['invite_reason'] i['invite_reason']=reason representation['members'].append(i) return representation class Meta: model=Group fields='__all__'
從Membership角度,他是建立量到兩個(gè)模型(Group,Person)的多對(duì)1關(guān)系,Django在啟動(dòng)時(shí),會(huì)自動(dòng)在其關(guān)聯(lián)的模型上建立"[model]_set"的屬性,就想常規(guī)的多對(duì)一關(guān)系一樣——實(shí)際上他就是常規(guī)的多對(duì)一關(guān)系,只不過(guò)Person讓其充當(dāng)另外的角色罷了。
reason=MembershipSerializers(instance.membership_set.get(group=instance.id,person=i[‘id’])).data[‘invite_reason’]
instance.membership_set.get(group=instance.id,person=i[‘id’])group和person聯(lián)合查出邀請(qǐng)?jiān)?/p>
person和group模型上membership對(duì)象的默認(rèn)名稱都將為membership_set.所以通過(guò)instance.membership_set.get()可以查看group下的所有關(guān)系
person下的所有membership:
#def to_representation(self,instance): #representation=super(PersonSerializers,self).to_representation(instance) #representation['reason']=MembershipSerializers(instance.membership_set,many=True).data #return representation
綜上所述,這篇文章就給大家介紹到這里了,希望可以給大家?guī)?lái)不幫助。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/128845.html
摘要:為關(guān)聯(lián)關(guān)系設(shè)置約束子模型的等于父模型的上面設(shè)置的字段的值子類實(shí)現(xiàn)這個(gè)抽象方法通過(guò)上面代碼看到創(chuàng)建實(shí)例時(shí)主要是做了一些配置相關(guān)的操作,設(shè)置了子模型父模型兩個(gè)模型的關(guān)聯(lián)字段和關(guān)聯(lián)的約束。不過(guò)當(dāng)查詢父模型時(shí),可以預(yù)加載關(guān)聯(lián)數(shù)據(jù)。 Database 模型關(guān)聯(lián) 上篇文章我們主要講了Eloquent Model關(guān)于基礎(chǔ)的CRUD方法的實(shí)現(xiàn),Eloquent Model中除了基礎(chǔ)的CRUD外還有一個(gè)...
摘要:而對(duì)于標(biāo)簽來(lái)說(shuō),一篇文章可以有多個(gè)標(biāo)簽,同一個(gè)標(biāo)簽下也可能有多篇文章,所以我們使用,表明這是多對(duì)多的關(guān)聯(lián)關(guān)系。理解多對(duì)一和多對(duì)多兩種關(guān)聯(lián)關(guān)系我們分別使用了兩種關(guān)聯(lián)數(shù)據(jù)庫(kù)表的形式和。表明一種一對(duì)多的關(guān)聯(lián)關(guān)系。 設(shè)計(jì)博客的數(shù)據(jù)庫(kù)表結(jié)構(gòu) 博客最主要的功能就是展示我們寫(xiě)的文章,它需要從某個(gè)地方獲取博客文章數(shù)據(jù)才能把文章展示出來(lái),通常來(lái)說(shuō)這個(gè)地方就是數(shù)據(jù)庫(kù)。我們把寫(xiě)好的文章永久地保存在數(shù)據(jù)庫(kù)里,...
摘要:默認(rèn)情況下,這個(gè)管理器的名字為,其中是源模型的小寫(xiě)名稱。創(chuàng)建一個(gè)新的對(duì)象,將它保存并放在關(guān)聯(lián)的對(duì)象集中。從關(guān)聯(lián)的對(duì)象集中刪除指定的模型對(duì)象。 模型關(guān)系 簡(jiǎn)介 關(guān)系數(shù)據(jù)庫(kù)的威力體現(xiàn)在表之間的相互關(guān)聯(lián),Django提供了三種最常見(jiàn)的數(shù)據(jù)庫(kù)關(guān)系:多對(duì)一(many-to-one),多對(duì)多(many-to-many),一對(duì)一(one-to-one) 多對(duì)一關(guān)系 多對(duì)多關(guān)系 一對(duì)一關(guān)系 多對(duì)一...
閱讀 1170·2023-01-14 11:38
閱讀 1160·2023-01-14 11:04
閱讀 987·2023-01-14 10:48
閱讀 2538·2023-01-14 10:34
閱讀 1241·2023-01-14 10:24
閱讀 1124·2023-01-14 10:18
閱讀 736·2023-01-14 10:09
閱讀 818·2023-01-14 10:02