我想要一个自定义(只读)序列化器字段,如果它是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()
在空字段上运行的任何想法?
答案 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