Напишите вложенный сериализатор с помощью 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.