使用附加字段反序列化模型
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
我会尽可能直截了当:
我有一个 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