1
在DRF文档SerializerMethodField它提供了以下用法示例如何方法字段添加到ModelSerializer
class UserSerializer(serializers.ModelSerializer):
days_since_joined = serializers.SerializerMethodField()
class Meta:
model = User
def get_days_since_joined(self, obj):
return (now() - obj.date_joined).days
不幸的是,在DRF的最新版本,因为ModelSerializer预计无论是fields
或exclude
是存在于失败元。这提出了一个问题。如果我列出的fields
列表的方法领域,我得到一个错误
django.core.exceptions.ImproperlyConfigured: Field name `days_since_joined` is not valid for model `User`.
如果我不包括方法场或者如果我使用fields = "__all__"
或者,如果我用exclude
方法场结束了在系列化失踪数据。
如何在模型序列化程序中包含方法字段?
编辑:我发现一个丑陋的黑客,允许为自定义模型添加方法字段。您可以将模型添加到模型中,然后按预期工作。
class MyModel(models.Model):
field1 = models.IntegerField()
field2 = models.CharField()
# more fields
@property
def my_method_field(self):
return None
class MyModelSerializer(serializers.ModelSerializer):
my_method_field = serializers.SerializerMethodField(method_name='bleh')
class Meta:
model = MyModel
fields = ('field1', 'field2', 'my_method_field')
def bleh(self, obj):
return 'Bleh!'
但添加占位符属性代码模型这样的事情是不是一个很好的做法,这并没有解决外部定义的模型,如Django的用户模型这样的问题。
编辑#2我会发誓,我已经尝试添加排除和字段的每种可能的组合。然而,不知何故,当我第二天回到问题时,它只是合理排除。我将标记“空的排除”的答案作为正确的答案,并将其留在这里作为对人类关注的浮躁和gremlins的秘密魔力的赞扬。
你能否确认一下,如果你得到'days_since_joined'不存在或'date_joined'不是? – vignesh
要做的检查是正确的: - 方法名是Meta.fields(让我们说这是“富”) - 不要忘记添加一个“富” SerializerMethodField财产 - 对于方法本身 - 确保它是get_foo而不仅仅是foo。不要make method_name ='foo'和def foo(你不能有相同的名字)。您可以使用method_name,但确保它是唯一的。 – Bufke