Django update_or_create вызывает IntegrityError внутри сериализатора

У меня есть следующая модель ModelSerializer с методом create. В этом методе я вызываю метод модели update_or_create. Но когда я это делаю, валидация сериализатора выдает ошибку

rest_framework.exceptions.ValidationError: [{'non_field_errors': [ErrorDetail(string='The fields user_id, capacity_id must make a unique set.', code='unique')]}, {}].

Я думал, что поскольку я использую update_or_create, он найдет строку, которая соответствует проверенным данным user_id и capacity_id, а затем обновит эту строку. Но проверка выполняется перед созданием, и данные не являются действительными из-за ограничения уникальности. Как же мне проигнорировать это ограничение?

class ActivatedCapacitySerializer(serializers.ModelSerializer):
    user_id = serializers.IntegerField(required=False)
    capacity_id = serializers.IntegerField(required=False)

    class Meta:
        model = ActivatedCapacity
        fields = ('user_id', 'capacity_id', 'active')

    def create(self, validated_data):
        activated_capacity = ActivatedCapacity.objects.update_or_create(
            user_id=validated_data['user_id'],
            capacity_id=validated_data['capacity_id'],
            defaults = {
                'active': validated_data['active']
            }
        )

        return activated_capacity

Models.py

class ActivatedCapacity(models.Model):
    user_id = models.IntegerField()
    capacity_id = models.IntegerField()
    active = models.BooleanField(default=False)

    class Meta:
        unique_together = ('user_id', 'capacity_id',)

Мне просто нужно было включить в сериализатор class Meta пустой список валидаторов, чтобы он переопределил валидаторы модели по умолчанию.

class ActivatedCapacitySerializer(serializers.ModelSerializer):
    user_id = serializers.IntegerField(required=False)
    capacity_id = serializers.IntegerField(required=False)

    class Meta:
        model = ActivatedCapacity
        fields = ('user_id', 'capacity_id', 'active')
        validators = []
     
    ...
Вернуться на верх