首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Django REST框架:序列化程序上的Unique_together验证

Django REST框架:序列化程序上的Unique_together验证
EN

Stack Overflow用户
提问于 2014-03-24 21:34:36
回答 6查看 26.1K关注 0票数 27

如果序列化程序实例在模型端失败了一个serializer.is_valid()约束,则返回Trueunique_together会出现问题。

是否有一种方法可以在序列化程序中指定以强制执行unique_together约束?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2014-09-24 22:46:56

不幸的是,Andreas的回答并不完全,因为它在更新的情况下是行不通的。

相反,您可能需要更像这样的东西:

代码语言:javascript
运行
复制
def validate(self, attrs):
    field1 = attrs.get('field1', self.object.field1)
    field2 = attrs.get('field2', self.object.field2)

    try:
        obj = Model.objects.get(field1=field1, field2=field2)
    except StateWithholdingForm.DoesNotExist:
        return attrs
    if self.object and obj.id == self.object.id:
        return attrs
    else:
        raise serializers.ValidationError('field1 with field2 already exists')

这将适用于PUT、PATCH和POST。

票数 13
EN

Stack Overflow用户

发布于 2015-03-02 17:42:34

ModelSerializer类具有此功能内建(至少在djangorestframework>=3.0.0中是如此),但是如果您使用的是不包含所有受unique_together约束影响的字段的serializer,则在保存违反该约束的实例时将得到一个IntegrityError。例如,使用以下模型:

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
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)

如果您试图保存两个具有相同foo_afoo_b集的实例,您将得到一个IntegrityError。但是,如果我们像这样修改序列化程序:

代码语言:javascript
运行
复制
class FooSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Foo
        fields = ('a', 'b', 'foo_a', 'foo_b')

然后,您将得到一个正确的HTTP 400 BAD REQUEST状态代码,以及响应正文中相应的JSON描述性消息:

代码语言:javascript
运行
复制
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."
    ]
}

我希望这会对你有所帮助,即使这是一个老问题;-)

票数 28
EN

Stack Overflow用户

发布于 2016-07-02 12:49:41

我需要这个来覆盖默认消息。由解决。

代码语言:javascript
运行
复制
from django.utils.translation import ugettext_lazy as _
from rest_framework import serializers


class SomeSerializer(serializers.ModelSerializer):
  """
  Demostrating How to Override DRF UniqueTogetherValidator Message
  """

    class Meta:
        model = Some
        validators = [
            serializers.UniqueTogetherValidator(
                queryset=model.objects.all(),
                fields=('field1', 'field2'),
                message=_("Some custom message.")
            )
        ]

Similarly you can specify fields

票数 23
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22621060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档