Django rest框架唯一在一起错误消息不再显示



我使用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"]

但现在我只得到一个500的响应,其中包含一个python错误。这个错误似乎再也没有被发现了。现在我只得到:

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

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

DRF不会像验证unique_together那样验证UniqueConstraint

这样做的原因是因为唯一约束可能比仅仅"约束"更复杂;该字段集合必须具有唯一值";。考虑以下内容:

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

该约束仅在状态为published时验证该行是唯一的,即,如果所有行都是草稿,则可以有多行具有相同的段塞和作者。由于这种复杂性,没有一个验证程序。然而,对于这种简单的情况,您可以手动添加DRF的UniqueTogether验证器:

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

最新更新