Допустим, у меня есть простая Product
Django модель:
class Product:
name = models.CharField(max_length=255, unique=True)
created_on = models.DateField()
Я использую Django Rest Framework для сериализации этой модели. Я хотел бы разбить created_on
на отдельный объект (включая ответ от запросов GET и полезную нагрузку в запросах POST):
{
"name": "MyProduct",
"created_on": {
"year": 2020,
"month": 1,
"day": 24
}
}
Вот что у меня есть на данный момент:
class DateSerializer(serializers.Serializer):
year = serializers.IntegerField()
month = serializers.IntegerField()
day = serializers.IntegerField()
def validate(data):
return datetime.date(data["year"], data["month"], data["day"])
class ProductSerializer(serialzers.ModelSerializer):
created_on = DateSerializer()
class Meta:
model = Friend
fields = ("name", "created_on")
def create(self, validated_data):
return Product.objects.create(**validated_data)
class ProductViewset(viewsets.ModelViewSet):
queryset = Product.objects.all()
serializer_class = ProductSerializer
Этот подход работает для запросов GET (то есть я получаю json выше). Однако он не работает для запросов POST (полезная нагрузка - json выше). Ответом будет 400
код состояния с сообщением {'created_on': [ErrorDetail(string='This field is required.', code='required')]}
.
Если я передам required=False
в DateSerializer
, я увижу, что self.initial_data
в методе create
будет <QueryDict: {'name': ['MyProduct'], 'created_on': ['year', 'month', 'day']}>
. Значит, значения по какой-то причине исчезают.
Есть идеи, что я здесь делаю не так и как я могу заставить это работать?