如果值为 null,自定义 Django Rest Framework 序列化器字段不会运行 `to_representation()`

tru*_*one 6 django serialization django-rest-framework

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

模型.py:

class Book(models.Model):
  title = models.CharField(max_length=255)
  rating = models.IntegerField(null=True)
Run Code Online (Sandbox Code Playgroud)

序列化器:

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)
Run Code Online (Sandbox Code Playgroud)

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

hamlet = Book(title="Hamlet")
BookSerializer(instance=hamlet).data
Run Code Online (Sandbox Code Playgroud)

我得到以下回复:

{'title': 'Hamlet', 'rating', None}
Run Code Online (Sandbox Code Playgroud)

请注意评级是如何的,None而不是“这本书很糟糕”。

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

rud*_*dra 3

据我从实现中了解到,to_representation如果值为None ,则不会调用方法。所以为了避免这个问题,我认为你可以使用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
Run Code Online (Sandbox Code Playgroud)