最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Django細致講解多對多使用through自定義中間表方法

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

多對多中間表詳解

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

默認中間表

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

讓我們來看看,中間表是個什么樣子的:

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

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

通過through自定義中間表

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

Django提供了一個through參數(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()  # 進組時間
    invite_reason = models.CharField(max_length=64)  # 邀請原因

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角度,他是建立量到兩個模型(Group,Person)的多對1關(guān)系,Django在啟動時,會自動在其關(guān)聯(lián)的模型上建立"[model]_set"的屬性,就想常規(guī)的多對一關(guān)系一樣——實際上他就是常規(guī)的多對一關(guān)系,只不過Person讓其充當另外的角色罷了。

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)合查出邀請原因

person和group模型上membership對象的默認名稱都將為membership_set.所以通過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細致講解多對多使用through自定義中間表方法的文章就介紹到這了,更多相關(guān)Django through自定義中間表內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關(guān)文章

  • 簡單了解Python matplotlib線的屬性

    簡單了解Python matplotlib線的屬性

    這篇文章主要介紹了簡單了解Python matplotlib線的屬性,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-06-06
  • python同義詞替換的實現(xiàn)(jieba分詞)

    python同義詞替換的實現(xiàn)(jieba分詞)

    這篇文章主要介紹了python同義詞替換的實現(xiàn)(jieba分詞),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-01-01
  • Python中match語句的詳細用法實例

    Python中match語句的詳細用法實例

    match語句接受一個表達式并將其值與作為一個或多個?case?塊給出的連續(xù)模式進行比較,下面這篇文章主要給大家介紹了關(guān)于Python中match語句的詳細用法,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2022-11-11
  • anaconda如何創(chuàng)建和刪除環(huán)境

    anaconda如何創(chuàng)建和刪除環(huán)境

    這篇文章主要介紹了anaconda如何創(chuàng)建和刪除環(huán)境,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-04-04
  • Python基礎(chǔ)之列表常見操作經(jīng)典實例詳解

    Python基礎(chǔ)之列表常見操作經(jīng)典實例詳解

    這篇文章主要介紹了Python基礎(chǔ)之列表常見操作,結(jié)合實例形式詳細分析了Python列表創(chuàng)建方式、內(nèi)置函數(shù)與相關(guān)使用技巧,需要的朋友可以參考下
    2020-02-02
  • 使用python繪制地圖的示例代碼

    使用python繪制地圖的示例代碼

    要在Python中繪制地圖,你可以使用各種庫和工具包,其中最常用的是matplotlib和folium,本文就來給大家介紹一下如何使用python繪制地圖,文章通過代碼示例介紹的非常詳細,需要的朋友可以參考下
    2023-08-08
  • python爬蟲模塊URL管理器模塊用法解析

    python爬蟲模塊URL管理器模塊用法解析

    這篇文章主要介紹了python爬蟲模塊URL管理器模塊用法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • Python中使用sqlalchemy操作數(shù)據(jù)庫的問題總結(jié)

    Python中使用sqlalchemy操作數(shù)據(jù)庫的問題總結(jié)

    在探索使用?FastAPI,?SQLAlchemy,?Pydantic,Redis,?JWT?構(gòu)建的項目的時候,其中數(shù)據(jù)庫訪問采用SQLAlchemy,并采用異步方式,這篇文章主要介紹了在Python中使用sqlalchemy來操作數(shù)據(jù)庫的幾個小總結(jié),需要的朋友可以參考下
    2024-08-08
  • Numpy中vstack()和hstack()的使用方式

    Numpy中vstack()和hstack()的使用方式

    文章詳細介紹了Numpy中vstack()和hstack()兩種數(shù)組拼接方法,vstack()是垂直堆疊數(shù)組,需保證除第一軸(行)外,數(shù)組形狀相同,hstack()是按順序堆疊數(shù)組,需保證除第二軸(列)外,數(shù)組形狀相同,兩者都可通過堆疊給定數(shù)組最后形成至少二維的數(shù)組
    2024-10-10
  • Python的in,is和id函數(shù)代碼實例

    Python的in,is和id函數(shù)代碼實例

    這篇文章主要介紹了python的in,is和id函數(shù)代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04

最新評論

津南区| 额尔古纳市| 巴楚县| 蒙阴县| 象州县| 万盛区| 永靖县| 探索| 乾安县| 江山市| 商都县| 鄂伦春自治旗| 曲靖市| 达日县| 中西区| 互助| 皮山县| 美姑县| 蓝山县| 霍林郭勒市| 云和县| 青龙| 元江| 大方县| 吉安市| 普洱| 惠东县| 凌源市| 乃东县| 龙泉市| 扎囊县| 尚志市| 江津市| 邢台县| 南康市| 达日县| 余干县| 荃湾区| 日照市| 涞源县| 旌德县|