Drf unique_together防止销毁视图集

时间:2019-02-04 15:36:41

标签: django django-rest-framework

我有一个具有unique_together约束的模型

class ExampleModel(models.Model):
  id = models.AutoField(primary_key=True)
  cmp = models.ForeignKey('Titles',
       on_delete=models.PROTECT)
  env = models.CharField(max_length=32)

      class Meta:
        unique_together = (
            'cmp ',
            'env ',
        )

具有以上字段的序列化器:

class ExampleModelSerializer(serializers.ModelSerializer):

    class Meta:
        model = ExampleModel
        fields = ('id', 'cmp ', 'env')

在视图集中,以下销毁方法:

 def destroy(self, request, pk):
     serializer = self.get_serializer(data=request.query_params)
     serializer.is_valid(raise_exception=True)

     instance = self.get_object()
     self.perform_destroy(instance)

在线serializer.is_valid()中断并出现以下错误:

{"non_field_errors":["The fields cmp, envmust make a unique set."]}

任何想法为什么会发生以及解决它的正确方法是什么

2 个答案:

答案 0 :(得分:0)

使用库存DRF销毁物品的正确方法是提供唯一的ID(通常是pk)并销毁它。 通过在没有实例的情况下调用序列化程序,您就好像在创建一个新实例一样。这就是DRF不允许您通过验证步骤的原因。

答案 1 :(得分:0)

destroy动作不需要任何数据,因此您不应该提供或尝试序列化请求正文。它只是从URL获取ID,因为它是一个详细信息终结点,获取对象并删除。您可能需要先了解一下destroy的原始实现