我创建了更新产品 API,我必须在其中更新多对多字段。产品模型与类别和变体模型具有 m2m 关系。我可以使用 instance.category.set(), 更新 Category 模型字段,但是当我对 Variants 尝试相同的操作时,它会生成上述错误。
我正在发送这样的原始 JSON 数据。
我的模型:
class Category(models.Model):
name = models.CharField(max_length=100, unique=True)
image = models.ImageField(null=True, blank=True)
class Meta:
verbose_name_plural = "Categories"
class Variants(models.Model):
product_id = models.CharField(max_length=70, default='OAXWRTZ_12C',blank=True)
price = models.DecimalField(decimal_places=2, max_digits=20,default=500)
size = models.CharField(max_length=50, choices=SIZE, default='not applicable',blank=True,null=True)
color = models.CharField(max_length=70, default="not applicable",blank=True,null=True)
variant_image = models.ImageField(upload_to="products/images", blank=True)
quantity = models.IntegerField(default=10,blank=True,null=True) # available quantity of given product
variant_availability = models.CharField(max_length=70, choices=AVAILABILITY, default='available')
class Product(models.Model):
merchant = models.ForeignKey(Seller,on_delete=models.CASCADE,blank=True,null=True)
category = models.ManyToManyField(Category, blank=False)
brand = models.ForeignKey(Brand, on_delete=models.CASCADE)
collection = models.ForeignKey(Collection, on_delete=models.CASCADE)
variants = models.ManyToManyField(Variants,related_name='products')
我的观点:
class ProductUpdateView(UpdateAPIView):
permission_classes = [AllowAny]
queryset = Product.objects.all()
serializer_class = ProductUpdateSerializer
我的序列化程序:
class ProductUpdateSerializer(serializers.ModelSerializer):
variants = VariantSerializer(many=True)
class Meta:
model = Product
fields = ['id','category','featured', 'top_rated','brand','collection',
'name','description', 'main_product_image','best_seller',
'rating','availability','warranty','services','variants']
def update(self, instance, validated_data):
instance.featured = validated_data.get('featured',instance.featured)
instance.top_rated = validated_data.get('top_rated', instance.top_rated)
instance.brand = validated_data.get('brand', instance.brand)
instance.collection = validated_data.get('collection',instance.collection)
instance.name = validated_data.get('name', instance.name)
instance.description = validated_data.get('description', instance.description)
instance.save()
#category_logic
category_data = validated_data.pop('category')
instance.category.set(category_data)
instance.save()
#variants_logic
variants_data = self.validated_data.get('variants')
instance.variants.set(variants_data)
instance.save()
return instance
我的网址:
path('api/updateproducts/<int:pk>', views.ProductUpdateView.as_view(), name = 'api-updateproducts'),