python - Django rest framework unique together 错误消息不再显示
问题描述
我经常使用 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'")
有谁知道为什么会发生这种变化?
解决方案
DRF 不会UniqueConstraint
以它的方式验证 s unique_together
。
这样做的原因是因为唯一约束可能比“这个字段集合必须具有唯一值”更复杂。考虑以下:
UniqueConstraint(
fields=["author", "slug"],
condition=Q(status="published"),
name="author_slug_published_uniq",
)
此约束仅在状态为 时验证该行是唯一的published
,即如果它们都是草稿,则可以有多个具有相同 slug 和作者的行。由于这种复杂性,因此没有验证器。但是,对于这种简单的情况,您可以手动添加DRF 的UniqueTogether
验证器:
class ClientSerializer(serializers.ModelSerializer):
class Meta:
fields = ["id", "name", "description", "company"]
validators = [
UniqueTogetherValidator(
queryset=Client..objects.all(),
fields=["name", "company"],
)
]
推荐阅读
- java - log4j 文件随机进入桌面
- javascript - 使用 USB 数据线从 Beacon 读取/写入数据
- android - 如何在启动另一个设备之前等待设备完成最后一个 adb 命令?
- php - PHP在两个字符串之间获取字符串
- ios - 按单词包装 UILabel 并以编程方式扩展 UITableViewCell 高度
- html - 位置:绝对;仅在将鼠标悬停在 div 上时可见
- ms-access - 如何在以查询为控制源的报表上显示有关 n 个项目的信息(从另一个表中获取)?
- javascript - 如何在 JQuery 中创建一个全局函数?
- javascript - 使用多个