使用附加字段反序列化模型

Deserializing a model with an additional field

我会尽可能直截了当:

我有一个 Challenge 模型,它包含有关特定挑战及其给出的分数数量的信息。对于给定的挑战,任何 User 都可以有多个 Submissions。 在查询特定 Challenge 时,我想 return JSON 包含挑战的信息以及当前 request.user 获得的最高分数。有没有办法以某种方式将值 ducktype(附加)到模型实例并使用给定的 Serializer class?

序列化它

我发现 ModelSerializer 要求模型本身具有该字段,在我的例子中我动态添加它。

解决这个问题的好方法是什么?有人遇到过类似的问题吗?

这可以通过从额外上下文访问序列化程序中的 request.user 来完成。

在通用视图中,模型序列化程序提供了额外的上下文。此上下文具有请求对象。

您可以在 Challenge 序列化器上定义一个方法字段

class ChallengeSerializer(serializers.ModelSerializer):
    user_max_score = serializers.SerializerMethodField()

    class Meta:
        model = Challenge
        fields = '__all__'

    def get_user_max_score(self, obj):
        user_max_score = 0
        request = self.context.get('request', None)
        if request:
            user = request.user
            # get the user's max score
            ...
        return user_max_score

如果您不使用通用视图,您也可以提供额外的上下文。在这里阅读更多:http://www.django-rest-framework.org/api-guide/serializers/#including-extra-context