class Foo(models.Model):
class Meta:
unique_together = ('foo_a', 'foo_b')
a = models.TextField(blank=True)
b = models.TextField(blank=True)
foo_a = models.IntegerField()
foo_b = models.IntegerField(default=2)
以及以下序列化器和ViewSet:
class FooSerializer(serializers.ModelSerializer):
class Meta:
model = models.Foo
fields = ('a', 'b', 'foo_a')
class FooViewSet(viewsets.ModelViewSet):
queryset = models.Foo.objects.all()
serializer_class = FooSerializer
routes = routers.DefaultRouter()
routes.register(r'foo', FooViewSet)
class FooSerializer(serializers.ModelSerializer):
class Meta:
model = models.Foo
fields = ('a', 'b', 'foo_a', 'foo_b')
然后你会得到一个正确的HTTP 400 BAD REQUEST状态码,以及响应正文中相应的JSON描述性消息:
HTTP 400 BAD REQUEST
Content-Type: application/json
Vary: Accept
Allow: GET, POST, HEAD, OPTIONS
{
"non_field_errors": [
"The fields foo_a, foo_b must make a unique set."
]
}
from django.utils.translation import ugettext_lazy as _
from rest_framework import serializers, validators
class SomeSerializer(serializers.ModelSerializer):
"""
Demostrating How to Override DRF UniqueTogetherValidator Message
"""
class Meta:
model = Some
validators = [
validators.UniqueTogetherValidator(
queryset=model.objects.all(),
fields=('field1', 'field2'),
message=_("Some custom message.")
)
]
6条答案
按热度按时间sh7euo9m1#
ModelSerializer类内置了这个功能,至少在
djangorestframework>=3.0.0
中是这样的,但是如果你使用的serializer
不包括受unique_together
约束影响的 * 所有 * 字段,那么当保存一个违反它的示例时,你会得到一个IntegrityError
。例如,使用以下模型:以及以下序列化器和ViewSet:
如果您尝试保存两个示例,并使用相同的
foo_a
和foo_b
设置,您将得到一个IntegrityError
。但是,如果我们像这样修改序列化器:然后你会得到一个正确的
HTTP 400 BAD REQUEST
状态码,以及响应正文中相应的JSON描述性消息:我希望这个结果对你有帮助,即使这是一个有点老的问题;- )
jv2fixgn2#
我需要这个来覆盖默认消息。用this解决。
同样,您可以指定字段。
e3bfsja23#
不幸的是,Andreas的答案并不完全,因为它在更新的情况下不起作用。
相反,你会想要一些更像:
这将适用于PUT、PATCH和POST。
yrefmtwq4#
是的,你可以在序列化器的
.validate()
方法中完成。您在模型中设置的唯一约束是用于创建数据库约束,而不是用于验证。
yeotifhr5#
有同样的问题,从这个答案https://stackoverflow.com/a/26027788/6473175我能够让它工作,但不得不使用
self.instance
而不是self.object
。hgtggwj06#
这有点愚蠢,除了我之外,其他人都不太可能犯这个错误,但是我把同一个模型放在两个序列化器类中,结果我遇到了这个问题
希望我的错误能帮助到别人!