【问题标题】:Drf unique_together prevent destroy in viewsetDrf unique_together 防止视图集中的破坏
【发布时间】:2019-02-04 15:36:41
【问题描述】:

我有一个具有 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."]}

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

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

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

    【讨论】:

    • 我不明白你的意思。可以给我举个例子吗
    【解决方案2】:

    销毁操作不需要任何数据,因此您不应提供或尝试序列化请求正文。它只是从 URL 中获取 id,因为它是一个详细端点,获取对象并删除。您可能想在覆盖之前查看 destroy 的原始实现

    【讨论】:

    • 是的,但是如果我发送额外的参数来销毁方法以进行更多处理,该怎么办。我将如何验证和序列化它们?
    • @user1292656 为它制作了一个不同的序列化程序,它只接受和验证调用destroy时所需的字段。您使用的序列化程序强制存在多个字段,因为它主要用于创建和更新。您还可以将partial=True 传递给序列化程序。或者至少在帖子中指定您期望的字段,以便提出解决方案
    猜你喜欢
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 2014-01-01
    • 2014-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多