TypeError at /api/updateproducts/59 unhashable type: 'collections.OrderedDict' in Django Rest Framework

时间:2021-03-25 05:16:21

标签: json django api django-rest-framework many-to-many

我创建了更新产品 API,我必须在其中更新多对多字段。产品模型与类别和变体模型具有 m2m 关系。我可以使用 instance.category.set(), 更新 Category 模型字段,但是当我对 Variants 尝试相同的操作时,它会生成上述错误。

我正在发送这样的原始 JSON 数据。

enter image description here

我的模型:

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'),

0 个答案:

没有答案