11

我有以下使用Django REST Framework的序列化程序。

这是我目前所拥有的......

序列化程序.py

class ProductSerializer(serializers.ModelSerializer):

    score = serializers.SerializerMethodField('get_this_score')

    class Meta:
        model = Product
        fields = ('id', 'title', 'active', 'score')

    def get_this_score(self, obj):

        profile = Profile.objects.get(pk=19)
        score = [val for val in obj.attribute_answers.all() if val in profile.attribute_answers.all()]
        return (len(score))

网址.py

 url(r'^products/(?P<profile_id>.+)/$', ProductListScore.as_view(), name='product-list-score'),

这段代码存在一些问题。

1)婴儿车 pk=19 是硬编码的,self.kwargs['profile_id'].我应该已经尝试过,但我不知道如何将 kwarg 传递给方法,并且无法让 profile_id 工作。即我无法从 url 获取它。

2)这些代码中的任何一个都应该在模型中吗?我尝试添加到模型,但再次可以传递参数。

models.py 即方法类

     def get_score(self, profile):

        score = [val for val in self.attribute_answers.all() if val in 
profile.attribute_answers.all()]
            return len(score)
4

2 回答 2

22

序列化程序被传递一个上下文字典,其中包含视图实例,因此您可以通过执行以下操作来获取 profile_id:

view = self.context['view']
profile_id = int(view.kwargs['profile_id'])

但是在这种情况下,我认为您不需要这样做,因为 'obj' 在任何情况下都会设置为配置文件实例。

是的,您可以将“get_this_score”方法放在模型类上。您仍然需要“SerializerMethodField”,但它会简单地调用“return obj.get_this_score(...)”,从序列化器上下文中设置任何参数。

请注意,序列化程序上下文还将包括“请求”,因此如果需要,您还可以访问“请求.用户”。

于 2013-02-17T14:00:32.200 回答
7

要回答 jason 对 Tom 的回答的问题,您可以像这样通过相同的上下文机制访问请求对象。您从 ModelMethod 定义中引用请求对象,而不是传递它们。我能够使用它来访问当前的 request.user 对象,如下所示:

class ProductSerializer(serializers.ModelSerializer):
    score = serializers.SerializerMethodField('get_this_score')

    class Meta:
        model = Product
        fields = ('id', 'title', 'active', 'score')

    def get_this_score(self, obj):

        profile = self.context['request'].user
        score = [val for val in obj.attribute_answers.all() if val in profile.attribute_answers.all()]
        return (len(score))
于 2015-01-08T04:12:17.733 回答