DRF Создание объекта с параметрами вложенного объекта

У меня есть эти два класса в моем проекте Django Rest Framework

class Call(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4)
    client = models.ForeignKey('client.Client', on_delete=models.CASCADE, db_column='id_client')

class Client(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4)
    name = models.CharField(max_length=250, unique=True)

Затем у меня есть представление, которое просто расширяет "CreateApiView" без какого-либо дополнительного кода, а затем сериализатор:

class CallSerializer(serializers.ModelSerializer):
    client = ClientSerializer()

Что мне нужно сделать, так это создать объект Call после POST, передав в качестве параметров мой клиентский объект. Проблема в том, что если я это сделаю, django вернет мне эту ошибку: A client with that name already exists.

Поэтому я попытался отредактировать сериализатор таким образом ClientSerializer(read_only=True), но на этот раз он создает объект Call с Client, установленным в null.

Как я могу это исправить? Я знаю, что могу просто удалить вложенный ClientSerializer и затем отправить ID вместо всего объекта Client, но есть ли способ сделать это с вложенным сериализатором?

Вам придется настроить логику создания вашего сериализатора, как указано здесь (https://www.django-rest-framework.org/api-guide/relations/#writable-nested-serializers).

В итоге у вас должно получиться что-то вроде следующего (не проверено):

class CallSerializer(serializers.ModelSerializer):
    client = ClientSerializer()

    def create(self, validated_data):
        validated_data['client_id'] = validated_data.pop('client')['id']
        return super().create(validated_data)
Вернуться на верх