Django-rest: отправить POST-запрос с 2-мя внешними ключами - PullRequest
0 голосов
/ 18 октября 2019

Я хочу разместить данные в сериализаторе, имеющем 2 ForeignKey.
У меня есть следующие модели:

class Child(models.Model):
    first_name = models.CharField(max_length=40)
    description = models.CharField(max_length=40)

class Parent(models.Model):
    name = models.CharField(max_length=20)
    pet = models.ForeignKey(pet)
    child = models.ForeignKey(Child, related_name='boys')

class Pet(models.Model):
    kind = models.CharField(max_length=40)
------------------,
Class PetSerializer(ModelSerializer):
    class Meta:
        model = Pet
        fields = ('kind',)

class ParentSerializer(ModelSerializer):    
    pet = PetSerializer(many=True): 
    class Meta:
        model = Parent
        fields = ('name', 'pet')

class ChildSerializer(ModelSerializer):
    boys = ParentSerializer() 

    class Meta:
        model = Child
        fields = ('first_name', 'boys')

Мой первый вопрос: возможно ли получить вывод в виде:

{
    "first_name": "Peter",
    "boys": [
      {
        "name": "Bill",
         "kind": "dog"
        }
      ]
   }

Мой второй вопрос: И я пытаюсьотправить данные для создания новой модели, используя этот метод:




    def create(self, validated_data):
        clean_data = validated_data.pop('boys')
        child = Child.objects.create(**validated_data)
        for data in clean_data:
            Parent.objects.create(child=child, **data)
        return child
But I got this error: TypeError: Direct assignment to the reverse side of a related set is prohibited. Use boys.set() instead.

1 Ответ

0 голосов
/ 18 октября 2019

Только для вашего первого вопроса, вы можете использовать параметр источника в вашем ParentSerializer классе:

class ParentSerializer(ModelSerializer):    
    kind = serializers.CharField(source='pet.kind'): 
    class Meta:
        model = Parent
        fields = ('name', 'kind')

...