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

Django細(xì)致講解多對(duì)多使用through自定義中間表方法

 更新時(shí)間:2022年06月28日 10:53:00   作者:怎么會(huì)這樣!  
我們?cè)陂_(kāi)發(fā)網(wǎng)站的時(shí)候,無(wú)可避免的需要設(shè)計(jì)實(shí)現(xiàn)網(wǎng)站的用戶系統(tǒng),我們需要實(shí)現(xiàn)包括用戶注冊(cè)、用戶登錄、用戶認(rèn)證、注銷(xiāo)等功能,Django作為完美主義終極框架,它默認(rèn)使用auth_user表來(lái)存儲(chǔ)用戶數(shù)據(jù),下面我們來(lái)看看Django多對(duì)多使用through自定義中間表

多對(duì)多中間表詳解

我們都知道對(duì)于ManyToMany字段,Django采用的是第三張中間表的方式。通過(guò)這第三張表,來(lái)關(guān)聯(lián)ManyToMany的雙方。下面我們根據(jù)一個(gè)具體的例子,詳細(xì)解說(shuō)中間表的使用。

默認(rèn)中間表

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模型中,通過(guò)members字段,以ManyToMany方式與Person模型建立了關(guān)系。

讓我們來(lái)看看,中間表是個(gè)什么樣子的:

首先有一列id,這是Django默認(rèn)添加的,沒(méi)什么好說(shuō)的。然后是Group和Person的id列,這是默認(rèn)情況下,Django關(guān)聯(lián)兩張表的方式。如果你要設(shè)置關(guān)聯(lián)的列,可以使用to_field參數(shù)。

可見(jiàn)在中間表中,并不是將兩張表的數(shù)據(jù)都保存在一起,而是通過(guò)id的關(guān)聯(lián)進(jìn)行映射。

通過(guò)through自定義中間表

一般情況,普通的多對(duì)多已經(jīng)夠用,無(wú)需自己創(chuàng)建第三張關(guān)系表。但是某些情況可能更復(fù)雜一點(diǎn),比如如果你想保存某個(gè)人加入某個(gè)分組的時(shí)間呢?想保存進(jìn)組的原因呢?

Django提供了一個(gè)through參數(shù),用于指定中間模型,你可以將類(lèi)似進(jìn)組時(shí)間,邀請(qǐng)?jiān)虻绕渌侄畏旁谶@個(gè)中間模型內(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)名稱(chēng)都將為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ān)于Django細(xì)致講解多對(duì)多使用through自定義中間表方法的文章就介紹到這了,更多相關(guān)Django through自定義中間表內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關(guān)文章

最新評(píng)論