2013-12-10 33 views
5

讓我們從django文檔中使用的有關使用through參數的M2M關係的模型開始,指出將充當中介的模型。如何在django-rest中使用M2M關係

class Person(models.Model): 
    name = models.CharField(max_length=128) 

    def __unicode__(self): 
     return self.name 

class Group(models.Model): 
    name = models.CharField(max_length=128) 
    members = models.ManyToManyField(Person, 
            through='Membership') 

    def __unicode__(self): 
     return self.name 

class Membership(models.Model): 
    person = models.ForeignKey(Person) 
    group = models.ForeignKey(Group) 
    date_joined = models.DateField() 

    class Meta: 
     ordering = ['date_joined'] 

現在假設我想有一個休息讀寫視圖也包含每組裏面所有的人,通過場date_joined下令集團模式。 JSON序列化,我想獲得的是以下(成員與它們的ID只描述):

{ 
    "id": 1, 
    "name": "U2", 
    "members": [ 
     20, 
     269, 
     134, 
     12, 
    ] 
} 

我寫了一個串行:

class GroupSerializer(serializers.ModelSerializer): 
    members = serializers.SlugRelatedField(source='membership_set', 
              many=True, 
              read_only=False, 
              slug_field='person_id', 
              required=True) 

    class Meta: 
     model = Group 
     fields = ('id', 'name', 'members') 

而對於讀操作,它工作得很好,它不寫作。我應該如何定義串行因此,鑑於上述定義的序列化,它將被繼續:

  1. 創建組對象
  2. 添加每個工作組成員(通過創建一個成員對象)

回答

2

here您可以看到您正在嘗試執行的操作僅適用於讀取操作。這是DRF的一個常見問題,正如其創建者Tom Christie在this評論中所述。

另外,對於您想要的JSON序列化,建議使用與PK相關的字段,如here所示,儘管這不會幫助創建組對象並添加成員。你將不得不自己寫代碼。

希望這會有所幫助。

編輯通過創建成員將每個人的集團

代碼片段:

def post_save(self, obj, created=False): 
    # obj represents the Group object 
    if created: 
     # Test to see if the Group was successfully created 
     members = self.request.DATA.get('members', None) 
     if members not None: 
      for id in members: 
       person = Person.objects.get(id=id) 
       membership, m_created = Membership.objects.get_or_create(person=person, group=obj) 
       # Here you can use m_created to see if the membership already existed and to do whatever else you need. 

此實現假定您已經聲明瞭與auto_now date_joined。如果沒有,你也應該把它作爲參數傳入。

+0

非常感謝您給我的明確答案,以及文檔相關部分的鏈接或作者對該問題的回答。這是一個可惜的,我試圖做的並不是非常支持這個框架。你能否建議我通過自己編寫代碼來完成任務?什麼是正確的方法?再次感謝你! – Dragster

+0

我很高興我可以幫助:)至於創建部分,您可以在兩個位置執行此操作:在** post/create **方法或** post_save **方法中。我建議在** post_save **中完成它,因爲這意味着您允許框架創建Group對象,剩下要做的就是添加成員。我將用一小段代碼片段編輯我的答案,以瞭解如何使用此方法。 – AdelaN

+0

非常感謝,您的支持非常感謝! – Dragster