【问题标题】:Django rest framework unique together error message not displayed anymoreDjango rest framework unique together 错误消息不再显示
【发布时间】:2020-07-15 09:48:42
【问题描述】:

我经常使用 django rest 框架,直到今天一切正常。同一个函数突然返回不同的东西。我的客户模型上有一个独特的名字和公司。我最近创建了一个名为 AutoCompany 的 mixin,它会自动在客户端上设置公司。

我的客户模型:

class Client(AutoCompany):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=155)
    description = models.TextField(blank=True)

    class Meta:
        constraints = [
            models.UniqueConstraint(fields=["name", "company"], name="Name and company"),
        ]

汽车公司


class AutoCompany(models.Model):
    company = models.ForeignKey("company.Company", models.DO_NOTHING)

    def save(self, *args, **kwargs):
        company = apps.get_model("company.Company")

        try:
            self.company
        except company.DoesNotExist:
            self.company = get_request().user.company

        self.after_company_set()

        return super().save(*args, **kwargs)

    def after_company_set(self):
        pass

    class Meta:
        abstract = True

所以以前当我为同一家公司创建一个同名的客户时,我收到了一个 400 响应,并显示此错误:

The fields name, company must make a unique set.

我的序列化器如下所示:

class ClientSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Client
        fields = ["id", "name", "description"]

但现在我只收到一个带有 python 错误的 500 响应。似乎不再捕获该错误。现在我得到了:

django.db.utils.IntegrityError: (1062, "Duplicate entry 'test-cafd0ed10f9f4865a1d56abb67daa831' for key 'Name and company'")

有人知道为什么会发生这种变化吗?

【问题讨论】:

  • 在改成UniqueConstraint之前你用unique_together了吗?
  • @TomCarrick 是的!这正是我所做的。但我都试过了,它们都给出了相同的结果。

标签: python django django-rest-framework


【解决方案1】:

DRF 不会像 unique_together 那样验证 UniqueConstraints。

这是因为唯一约束可能比“这个字段集合必须具有唯一值”更复杂。考虑以下几点:

UniqueConstraint(
    fields=["author", "slug"],
    condition=Q(status="published"),
    name="author_slug_published_uniq",
)

此约束仅在状态为 published 时验证该行是唯一的,即如果它们都是草稿,则可以有多个具有相同 slug 和作者的行。由于这种复杂性,因此没有验证器。不过,对于这种简单的情况,您可以手动添加DRF's UniqueTogether validator

class ClientSerializer(serializers.ModelSerializer):
    class Meta:
        fields = ["id", "name", "description", "company"]
        validators = [
            UniqueTogetherValidator(
                queryset=Client..objects.all(),
                fields=["name", "company"],
            )
        ]

【讨论】:

  • 抱歉我的回复晚了。我得到一个KeyError: 'company' 可能是因为客户根据请求添加了公司并且没有传递给序列化程序。我会将序列化程序添加到问题中。另一个奇怪的事情是我也尝试过使用unique_together,它给出了同样的错误。我认为这是因为我如何添加公司(在基于请求的保存方法中)。但它应该抓住那个......对吧?
  • save() 方法中没有验证,因此不会验证。这对于添加唯一约束的任何方式都是相同的。如果您希望对此进行验证,则应将此逻辑移至序列化程序。
  • 嗯。似乎只有在视图集的创建功能中设置公司时才进行验证。这是不幸的。感谢您的信息!
猜你喜欢
  • 1970-01-01
  • 2019-12-29
  • 2011-05-25
  • 2019-07-17
  • 2021-08-01
  • 2019-04-01
  • 2015-08-03
  • 2017-11-08
  • 1970-01-01
相关资源
最近更新 更多