如果value为null,则自定义Django Rest Framework序列化器字段未运行`to_representation()`

时间:2019-01-18 16:00:23

标签: django serialization django-rest-framework

我想要一个自定义(只读)序列化器字段,如果它是None,它将替换序列化的值。我以为我可以覆盖to_representation(),但这似乎没有效果。这是一些代码:

models.py:

class Book(models.Model):
  title = models.CharField(max_length=255)
  rating = models.IntegerField(null=True)

序列化器:

class ReplaceableSerializerField(serializers.ReadOnlyField):

  def to_representation(self, value):
    if value is None:
      return "this book sucks"
    return value

class BookSerializer(serializers.ModelSerializer):

  class Meta:
    model = Book
    fields = ("title", "rating",)

  rating = ReplaceableSerializerField(allow_null=True)

如果我然后执行以下操作:

hamlet = Book(title="Hamlet")
BookSerializer(instance=hamlet).data

我收到以下答复:

{'title': 'Hamlet', 'rating', None}

请注意收视率是None,而不是“这本书很烂”。

关于如何强制to_representation()在空字段上运行的任何想法?

2 个答案:

答案 0 :(得分:1)

据我从implementation所了解,如果值为 None ,则不会调用to_representation方法。因此,为避免此问题,我认为您可以使用SerializerMethodField。您可以像这样使用它:

class BookSerializer(serializers.ModelSerializer):
  rating = serailizer.SerializerMethodField()

  class Meta:
    model = Book
    fields = ("title", "rating",)

  def get_rating(self, obj):
      if obj.rating == None:
         return "Something"
      return obj.rating

答案 1 :(得分:0)

我的解决方法是覆盖 get_attribute(self, instance) 方法。

def get_attribute(self, instance):
    value = getattr(instance, self.source)
    if value is None:
        return "this book sucks"
    return value

djangorestframework 3.12.4