2013-12-10 8 views
5

Beginnen wir mit den Modellen in den Django-Dokumenten über die M2M-Beziehung, die das Argument through verwendet, um auf das Modell zu verweisen, das als Vermittler fungiert.Mit M2M-Beziehung in Django-Rest arbeiten

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'] 

wird nun angenommen, ich will eine Pause machen Lese-Schreib- Ansicht für das Gruppenmodell, das innerhalb jeder Gruppe auch alle die Person enthält, von date_joined Feld bestellt. Die Json Serialisierung Ich mag würde erhalten, ist die folgende (die Mitglieder nur mit ihrer ID beschrieben werden):

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

ich einen Serializer schrieb:

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') 

Während für Leseoperationen es funktioniert gut, es nicht zum Schreiben. Wie soll ich den Serializer definieren, so dass die oben definierte Serialisierung gegeben, wird es durch vorgehen:

  1. die Objektgruppe erstellen
  2. jeweils Mitglieder der Gruppe hinzufügen (durch ein Mitgliedschaft-Objekt erstellen)

Antwort

2

Von here können Sie sehen, dass das, was Sie versuchen, funktioniert nur für Lesevorgänge. Dies ist ein häufiges Problem für DRF, wie von seinem Schöpfer, Tom Christie, in this Kommentar angegeben.

Auch für die JSON-Serialisierung, die Sie möchten, wird empfohlen, ein PK-bezogenes Feld zu verwenden, wie gezeigt here, obwohl dies nicht mit der Erstellung des Gruppenobjekts und Hinzufügen von Mitgliedern helfen wird. Sie müssen diesen Code selbst schreiben.

Hoffe, das hilft.

bearbeiten

-Code-Schnipsel für jede Person in die Gruppe hinzugefügt, indem Mitgliedschaften:

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. 

Diese Implementierung wird davon ausgegangen, dass Sie Ihre erklärt haben date_joined mit auto_now. Wenn nicht, sollten Sie es auch als Parameter übergeben.

+0

Vielen Dank für die klare Antwort, die Sie mir auch mit dem Link zum relevanten Teil der Dokumentation oder der Antwort des Autors auf den Punkt gegeben haben. Es ist schade, dass das, was ich versucht habe, vom Framework nicht sehr unterstützt wird. Könnten Sie mir bitte einen Weg vorschlagen, die Aufgabe zu erfüllen, indem Sie den Code selbst schreiben? Was ist der richtige Weg? Danke nochmal! – Dragster

+0

Ich bin froh, dass ich helfen konnte :) Wie für die Erstellung Teil können Sie es an zwei Orten tun: in der ** post/create ** Methode oder in der ** post_save ** Methode. Ich schlage vor, es in ** post_save ** zu machen, weil das bedeutet, dass Sie zulassen, dass das Framework das Gruppenobjekt erstellt, und dass nur noch die Member hinzugefügt werden müssen. Ich werde meine Antwort mit einem kleinen Code-Snippet für die Verwendung dieser Methode bearbeiten. – AdelaN

+0

Vielen Dank, Ihre Unterstützung wird sehr geschätzt! – Dragster