如何将方法字段添加到ModelSerializer

时间:2017-09-21 21:14:12

标签: django django-rest-framework

在SerializerMethodField的DRF文档中,它提供了以下用法示例

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期望Meta中存在fieldsexclude。这提出了一个问题。如果我列出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 User模型)执行此操作的问题。

编辑#2 我会发誓我已尝试添加排除和字段的所有可能组合。然而不知何故,当我第二天回到问题时,它只是合理排除。我将“空排除”的答案标记为正确的答案,并将其留在这里,以表达对人类注意力的浮躁和小鬼的秘密魔法的致敬。

1 个答案:

答案 0 :(得分:0)

你试过空exclude吗?

class UserSerializer(serializers.ModelSerializer):
    days_since_joined = serializers.SerializerMethodField()

    class Meta:
        model = User
        exclude = ()
        #       ^^^^^

    def get_days_since_joined(self, obj):
        return (now() - obj.date_joined).days