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