成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

Django細膩解讀多對多使用through自定中間表方法

89542767 / 607人閱讀

  大家在搭建網(wǎng)站時,無可避免的必須設計方案完成頁面的用戶系統(tǒng),我們應該完成包含新用戶注冊、賬號登錄、用戶認證、銷戶等服務,Django做為完美主義者最終架構,它默認設置使用auth_user表來存儲用戶數(shù)據(jù)信息,下面我們就來看看Django多對多使用through自定中間表


  多對多中間表詳細說明


  眾所周知針對ManyToMany字段,Django使用的是下一張中間表的形式。依據(jù)這下一張表,來關聯(lián)ManyToMany的彼此。下面我們就依據(jù)1個實際的事例,詳細解說中間表的應用。


  默認設置中間表


  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建立模型了關聯(lián)。


  讓我們一起來看看,中間表是一個什么樣:

01.png

  最先有某列id,這也是Django默認設置使用的,沒什么可說的。然后就是Group和Person的id列,這也是默認設置前提下,Django關聯(lián)二張表中方法。如果你想要設定關聯(lián)列,能使用to_field主要參數(shù)。


  由此可見在中間表中,并不是將二張表中數(shù)據(jù)儲存在一塊,而是用id的關聯(lián)開展投射。


  依據(jù)through自定中間表


  一般情況下,普通多對多早已足夠,不用自身建立下一張關系圖。不過一些狀況很有可能更加復雜一點兒,例如如果你想要儲存某些人添加某一分類的時長?想儲存接戲的原因吧?


  Django帶來了一個through參數(shù),用以特定正中間實體模型,你能將類似接戲時長,邀約緣故等其它字段名放到這一正中間實體模型內。事例如下所示:


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

02.png

  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下的所有關系


  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

03.png

04.png

  綜上所述,這篇文章就給大家介紹到這里了,希望可以給大家?guī)聿粠椭?/p>

文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://m.hztianpu.com/yun/128845.html

相關文章

  • Laravel核心解讀--Database(四) 模型關聯(lián)

    摘要:為關聯(lián)關系設置約束子模型的等于父模型的上面設置的字段的值子類實現(xiàn)這個抽象方法通過上面代碼看到創(chuàng)建實例時主要是做了一些配置相關的操作,設置了子模型父模型兩個模型的關聯(lián)字段和關聯(lián)的約束。不過當查詢父模型時,可以預加載關聯(lián)數(shù)據(jù)。 Database 模型關聯(lián) 上篇文章我們主要講了Eloquent Model關于基礎的CRUD方法的實現(xiàn),Eloquent Model中除了基礎的CRUD外還有一個...

    gekylin 評論0 收藏0
  • Django 博客開發(fā)教程 3 - 創(chuàng)建 Django 博客的數(shù)據(jù)庫模型

    摘要:而對于標簽來說,一篇文章可以有多個標簽,同一個標簽下也可能有多篇文章,所以我們使用,表明這是多對多的關聯(lián)關系。理解多對一和多對多兩種關聯(lián)關系我們分別使用了兩種關聯(lián)數(shù)據(jù)庫表的形式和。表明一種一對多的關聯(lián)關系。 設計博客的數(shù)據(jù)庫表結構 博客最主要的功能就是展示我們寫的文章,它需要從某個地方獲取博客文章數(shù)據(jù)才能把文章展示出來,通常來說這個地方就是數(shù)據(jù)庫。我們把寫好的文章永久地保存在數(shù)據(jù)庫里,...

    Shimmer 評論0 收藏0
  • Django基礎之八(模型關系)

    摘要:默認情況下,這個管理器的名字為,其中是源模型的小寫名稱。創(chuàng)建一個新的對象,將它保存并放在關聯(lián)的對象集中。從關聯(lián)的對象集中刪除指定的模型對象。 模型關系 簡介 關系數(shù)據(jù)庫的威力體現(xiàn)在表之間的相互關聯(lián),Django提供了三種最常見的數(shù)據(jù)庫關系:多對一(many-to-one),多對多(many-to-many),一對一(one-to-one) 多對一關系 多對多關系 一對一關系 多對一...

    lewif 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<