Python Django rest framework唯一在一起错误消息不再显示

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

我和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不会像它一样验证
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时,才会进行验证。这是不幸的。谢谢你的信息!