Напишите вложенный сериализатор с помощью GenericRelatedField()

У меня есть следующий код, в котором в одной из моделей я использую полиморфную модель с фреймворком django ContentType.

models.py

from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.fields import GenericRelation

# Create your models here.

class LastName(models.Model):
    last_name = models.CharField(max_length=100)
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey()

    def __str__(self):
        return self.last_name

class Person(models.Model):

    first_name = models.CharField(max_length=100)
    last_name = GenericRelation(LastName)
    def __str__(self):
        return self.first_name

serializers.py

from django.db import models
from rest_framework import serializers
from .models import Person, LastName
from django.contrib.contenttypes.models import ContentType

class LastNameSerializer(serializers.ModelSerializer):
    
    class Meta:
        model = LastName
        fields = '__all__'

class PersonSerializer(serializers.ModelSerializer):
    last_name = LastNameSerializer(required=False, many=True)
    class Meta:
        model = Person
        fields = ['id','first_name', 'last_name']
    

    def create(self, validate_data):
        last_names = validate_data.pop('last_name')

        person = Person.objects.create(**validate_data)
     
        for l_name in last_names:
            model = self.Meta.model
         
            names = LastName(content_object=person, **l_name)
            names.save()
            person.last_name.add(names.id)
        person.save()
        return person

В serializer.py я пытаюсь создать запрос для добавления более одного словаря с более чем одной фамилией, так как метод create() выше такой же, как если бы вы добавили неполиморфный сериализатор.

Полезная нагрузка, которую я пытаюсь отправить в конечную точку Person, выглядит следующим образом:

Post:

{
    "first_name": "Oliveira",
    "last_name": [
{"last_name":"Prado"},
{"last_name":"Moreira"},
]
}

Выход:

{
    "last_name": [
        {
            "object_id": [
                "This field is required."
            ],
            "content_type": [
                "This field is required."
            ]
        }
    ]
}

Вывод очевиден, но я не знаю, как передать content_type и object_id в методе create()?

Я выполняю следующий запрос для создания записываемого вложенного сериализатора с помощью обычного запроса:

>>> from poly_example.models import Person, LastName
>>> 
>>> person = Person(first_name="Oliver")
>>> person.save()
>>> 
>>> last_name = LastName(content_object=person, last_name="Prado")
>>> last_name.save()
>>> 
>>> person
<Person: Oliver>

Вот так я могу создать вложенный сериализатор:

    {
        "id": 3,
        "first_name": "Oliver",
        "last_name": [
            {
                "id": 1,
                "last_name": "Prado",
                "object_id": 3,
                "content_type": 7
            }
        ]
    }

но я не знаю, как передать этот подход в метод create() в PersonSerializer.

Вернуться на верх