Python Django rest framework唯一在一起错误消息不再显示
我和django rest框架一起工作过很多次,直到今天一切都很好。同一个函数突然返回不同的结果。我有一个独特的一起对我的客户模式与名称和公司。我最近创建了一个名为AutoCompany的mixin,它可以自动将公司设置为客户端 我的客户模型:Python Django rest framework唯一在一起错误消息不再显示,python,django,django-rest-framework,Python,Django,Django Rest Framework,我和django rest框架一起工作过很多次,直到今天一切都很好。同一个函数突然返回不同的结果。我有一个独特的一起对我的客户模式与名称和公司。我最近创建了一个名为AutoCompany的mixin,它可以自动将公司设置为客户端 我的客户模型: class Client(AutoCompany): id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) name = models.Ch
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不会像它一样验证
UniqueConstraint
s它将unique\u放在一起的方式
这是因为唯一约束可能比“此字段集合必须具有唯一值”更复杂。考虑以下事项:
UniqueConstraint(
字段=[“作者”,“段塞”],
条件=Q(status=“published”),
name=“author\u slug\u published\u uniq”,
)
此约束仅在状态为“已发布”时验证行是否唯一,即,如果多行都是草稿,则可能有多行具有相同的slug和author。由于这种复杂性,没有用于此的验证程序。但是,对于这种简单的情况,您可以手动添加:
class ClientSerializer(serializers.ModelSerializer):
类元:
字段=[“id”、“名称”、“说明”、“公司”]
验证器=[
唯一性验证器(
queryset=Client..objects.all(),
字段=[“名称”,“公司”],
)
]
在更改为UniqueConstraint
之前,您是否一起使用了unique\u
?@TomCarrick是!这正是我所做的。但是我试了两次,结果都一样。很抱歉我回复晚了。我得到一个keyrerror:“company”
,可能是因为客户机根据请求添加了company,而没有传递给序列化程序。我将把序列化程序添加到问题中。另一件奇怪的事情是,我也尝试过同时使用unique\u
,结果出现了同样的错误。我认为这是因为我如何添加公司(在基于请求的save方法中)。但它应该明白。。。对吗?save()
方法中没有验证,所以它不会验证。这对于任何添加唯一约束的方法都是一样的。如果希望对此进行验证,则应将此逻辑移动到serializer.Hmmm。似乎只有在viewset的create函数中设置company时,才会进行验证。这是不幸的。谢谢你的信息!