Django Rest Framework реализует update_or_create при десериализации объекта

Я хочу реализовать update_or_create при десериализации объекта. Я нашел ответ @K-Moe на этот вопрос: Django Rest Framework POST Update if existing or create

Я попробовал это решение, но получил ValidationError, говорящий, что мой объект уже существует:

[{'variant_id': [ErrorDetail(string='sku with this variant id already exists.', code='unique')]}, {'variant_id': [ErrorDetail(string='sku with this variant id already exists.', code='unique')]}]

Я что-то пропустил?

Моя модель

class Sku(models.Model):
    variant_id = models.CharField(primary_key=True, max_length=10, validators=[MinLengthValidator(10)])
    name = models.CharField(max_length=255)
    shop = models.ForeignKey(Shop, related_name='sku', on_delete=models.CASCADE)
    barcode = models.CharField(max_length=60, null=True, blank=True)
    price = models.FloatField(null=True, blank=True)

    def __str__(self):
        return self.name

    class Meta:
        constraints = [
            models.UniqueConstraint(fields=['variant_id', 'shop'], name='unique_shop_sku')
            ]

    @classmethod
    def update_or_create(cls, variant_id, shop_id, **kwargs):
        with transaction.atomic():
            return cls.objects.update_or_create(variant_id=variant_id, shop_id=shop_id, defaults=kwargs)

Мои сериализаторы:

class SkuSerializer(serializers.ModelSerializer):
    shop_id = serializers.CharField(source='shop')

    class Meta:
        model = Sku
        fields = ['name', 'shop_id', 'product_id', 'variant_id', 'barcode', 'price']

    def create(self, validated_data):
        sku = Sku.update_or_create(
            variant_id=validated_data.pop('variant_id'),
            shop_id=validated_data.pop('shop'),
            **validated_data
        )
        return sku
Вернуться на верх