@Lepilov

Использование вложенного сериализатора дляобновления объекта?

Есть такой сериализатор
class VendorManagementUpdateSerializer(serializers.ModelSerializer):
    ...
    parent = VendorToFrontSerializer()
    # parent = serializers.PrimaryKeyRelatedField(queryset=Vendors.objects.all(), required=False, allow_null=True)
    ...

    class Meta:
        model = Vendors
        fields = (...,
                  ....,
                  'parent',

                  )


class VendorToFrontSerializer(serializers.ModelSerializer):
    class Meta:
        model = Vendors
        fields = ('pk', 'vendor_name')


КОгда я пробую выполнить PUT метод (partial_update) такими данными
{
               "parent":123
            }


ТО получаю

{
    "parent": {
        "non_field_errors": [
            "Invalid data. Expected a dictionary, but got int."
        ]
    }
}


Я могу избежать этого изменив поле parent в сериализаторе на
parent = serializers.PrimaryKeyRelatedField(queryset=Vendors.objects.all(), required=False, allow_null=True)


И тогда все отрабатывает, но проблема в том что мне надо чтобы в респонсе возвращалаяь вся поля из сериализатора VendorToFrontSerializer а сейчас я получаю только id.

Что тут можно сделать?
  • Вопрос задан
  • 782 просмотра
Пригласить эксперта
Ответы на вопрос 1
Bobsans
@Bobsans
Full-Stack Developer
Можно у сериализатора переопределить методы create и update и там уже что угодно делать с данными.
Например:
class VendorManagementUpdateSerializer(serializers.ModelSerializer):
    ...
    parent = VendorToFrontSerializer()
    ...

    class Meta:
        model = Vendors
        fields = (..., 'parent', ...)

    def create(self, validated_data, **kwargs):
        parent = validated_data.pop('parent')
        instance = super().create(validated_data, **kwargs)
        parent_serializer = VendorToFrontSerializer(data=parent)
        if parent_serializer.is_valid():
            instance.parent = parent_serializer.save()
        return instance

    def update(self, instance, validated_data, **kwargs):
        # ...точно так же, только нужно будет уже имеющийся объект обновить

Можно, конечно, и оптимальней написать)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы