【问题标题】:Level-field validation in django rest framework 3.1 - access to the old valuedjango rest framework 3.1 中的级别字段验证 - 访问旧值
【发布时间】:2015-09-14 08:46:24
【问题描述】:

在更新对象之前验证标题字段。如何访问序列化对象的数据以便将value 与该对象的旧值进行比较?

from rest_framework import serializers

class BlogPostSerializer(serializers.Serializer):
    title = serializers.CharField(max_length=100)
    content = serializers.CharField()

    def validate_title(self, value):
        """
        Check that the blog post is about Django.
        """
        if 'django' not in value.lower():
            raise serializers.ValidationError("Blog post is not about Django")
        return value

【问题讨论】:

  • 您打算与旧对象进行什么样的比较?
  • 另外,您可以发布代码以供您查看。
  • @RahulGupta:基于上面的示例,我想检查标题是否更改为与以前相同,如果是则引发 ValidationError 异常。在 DRF 的第 2 版中,我可以在 validate_title 方法中使用 self.object.title。
  • 你的意思是如果title的值没有改变,你想引发异常吗?
  • @RahulGupta:抱歉,我无法发布此代码。是否可以在此序列化程序中进行此类检查?上面的例子来自 DRF 文档。我忘了说我在嵌套序列化器中使用了 ModelSerializer,而不是 Serializer,并且 BlogPostSerializer 被另一个 ModelSerializer 使用,该 ModelSerializer 在我的 ModelViewSet 中设置为 serializer_class。

标签: python django serialization django-rest-framework


【解决方案1】:

你可以这样做:

def validate_title(self, value):
        """
        Check that the title has not changed.
        """
        if self.instance and value != self.instance.title
            raise serializers.ValidationError("Title of a blog post cannot be edited ")
        return value

在更新操作的情况下,您可以以self.instance 的身份访问旧对象。然后你可以用它来执行你的检查。

【讨论】:

  • 可能我在某处犯了错误,但更新时self.instance 为无。有点奇怪,在升级 DRF 之前,我以与 self.instance 相同的方式使用 self.object,并且可以访问该对象。
  • update() 中,使用 get_object() 获取实例,然后传递给序列化程序。在序列化程序的__init__ 中,设置了self.instance 变量。所以你应该能够访问旧对象。尝试在update 方法中加入类似ipdb 的调试器。
  • 我设置了serializer_class=SomeModelSerializer 并在SomeModelSerializer 中使用了嵌套序列化程序blogpostserializer = BlogPostSerializer(required=False) - 此处未传递实例,这就是为什么self.instance 为None?
  • 为此,请尝试在您的视图中覆盖get_object(),看看您会得到什么。
  • 此外,DRF 文档说,如果您支持可写嵌套表示,则需要编写处理保存多个对象的 .create().update() 方法。 django-rest-framework.org/api-guide/serializers/…
猜你喜欢
  • 2015-08-17
  • 2015-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-17
  • 2022-11-02
  • 2013-02-17
  • 1970-01-01
相关资源
最近更新 更多