Zacznijmy od modeli używanych w dokumentach django o relacji M2M, która używa argumentu through, aby wskazać model, który będzie działał jako pośrednik.Jak pracować z relacją M2M w django-rest
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']
Załóżmy teraz chcę odpocząć odczytu i zapisu widok na modelu grupy, która zawiera również cały osoba wewnątrz każdej grupy, zamówionego przez date_joined dziedzinie. JSON serializacji chciałbym uzyskać jest następująca (członkowie są opisane tylko z ich ID):
{
"id": 1,
"name": "U2",
"members": [
20,
269,
134,
12,
]
}
Napisałem serializatora:
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')
Podczas gdy dla operacji odczytu to działa dobrze, nie służy do pisania. W jaki sposób należy określić serializatora tak, że biorąc pod uwagę powyższe zdefiniowane serializacji, będzie postępować według:
- Tworzenie obiektu grupy
- dodać każdy członków do grupy (poprzez utworzenie obiektu Membership)
Dziękuję za jasną odpowiedź, którą mi dałeś, z linkiem do odpowiedniej części dokumentacji lub odpowiedzi autora na temat. Szkoda, że to, co próbowałem zrobić, nie jest zbytnio wspierane przez ramy. Czy mógłbyś zaproponować mi sposób na wykonanie tego zadania, pisząc kod na własną rękę? Jaka jest właściwa droga? Jeszcze raz dziękuję! – Dragster
Cieszę się, że mogłem pomóc :) Jeśli chodzi o część tworzenia, można to zrobić w dwóch miejscach: w metodzie ** post/create ** lub w metodzie ** post_save **. Sugeruję, aby było to zrobione w ** post_save **, ponieważ oznacza to, że pozwalasz ramowi na tworzenie obiektu Group, a wszystko, co pozostało do zrobienia, to dodawanie członków. Będę edytować moją odpowiedź za pomocą małego fragmentu kodu, aby dowiedzieć się, jak korzystać z tej metody. – AdelaN
Dziękuję bardzo, twoje wsparcie jest bardzo cenne! – Dragster