Как сделать динамический сериализатор полей в Django RestFramework
Я хочу добавить сериализатор массива динамических полей в свой drf-проект:
Мой ответ выглядит примерно так:
{
"title": "some",
"created_at": "2022-03-06T15:59:52.684469Z",
"fields": [
{
"id": 1,
"title": "Some title?",
"parent_field": 1
},
{
"id": 2,
"title": "Yet another fields",
"parent_field": 1
}
]
}
Это сериализатор деталей элемента, а поля - это другой сериализатор модели. Я достиг этого, используя следующий код:
class AnotherFieldSerializer(serializers.ModelSerializer):
class Meta:
model = AnotherModel
fields = "__all__"
class FirstSerializer(serializers.ModelSerializer):
fields = serializers.SerializerMethodField()
class Meta:
model = FirstModel
fields = "__all__"
def get_fields(self, obj):
serializer_context = {'request': self.context.get('request')}
children = obj.fields
if not children.exists():
return None
serializered_children = FirstSerializer(
children,
many=True,
context=serializer_context
)
return serializered_children.data
Это работает только для GET запросов, я хочу, чтобы это также работало с POST и PUT запросами. Итак, представьте, что я хочу добавить/редактировать элемент в мою модель FIRST и добавить связанные с ним поля, просто отправив этот JSON:
{
"title": "some",
"created_at": "2022-03-06T15:59:52.684469Z",
"fields": [
{
"id": 1,
"title": "Some title?",
},
{
"id": 2,
"title": "Yet another fields",
}
]
}
Я знаю, что могу получить поля из ответа и просмотреть каждый элемент, чтобы создать экземпляр другой модели, но проверка полей будет намного сложнее, я думаю. Но если есть более подробная информация о том, как это сделать, было бы здорово. Также, я не против сделать еще один сериализатор только для POST и PUT запросов.
Надеюсь, мой английский был понятен.
Вы можете создать новый сериализатор для валидации. Для валидации нескольких элементов вы можете сделать следующее,
class PostSerializer(serializers.Serializer):
title = serializers.CharField(max_length=200)
created_at = serializers.DateTimeField()
fields = FirstSerializer(many=True) # your model serializer for the FirstModel
Ref : https://www.django-rest-framework.org/api-guide/serializers/#listserializer