在通过SerializerMethodField调用的方法中传递参数

时间:2016-01-12 12:24:14

标签: django-rest-framework serializer

我使用以下代码定义了一个序列化程序:

class TermSerializer(serializers.ModelSerializer):

    associatedVocabs = serializers.SerializerMethodField('get_assocVocabs')
    equivalentVocabs = serializers.SerializerMethodField('get_equivVocabs')

    def get_assocVocabs(self,obj):
        vocabs = Vocab.objects.none()
        related = RelationTerm.objects.filter(from_term = obj.id, relation=1)
        return related

    def get_equivVocabs(self,obj):
        vocabs = Vocab.objects.none()
        related = RelationTerm.objects.filter(from_term = obj.id, relation=2)
        return related

    class Meta:
        model = Term
        fields = ('id', 'associatedVocabs', 'equivalentVocabs')

正如您在此序列化程序中看到的,我定义了两种方法:get_assocVocabsget_equivVocabs。 它们完全相同,过滤器中关系的值有什么变化,1是过滤相关的词汇,2是获得等效的词汇。

顺便说一句,这是我的观点:

class TermViewSet(viewsets.ModelViewSet):
    renderer_classes = (TermJSONRenderer, BrowsableAPIRenderer, )
    serializer_class = TermSerializer
    allowed_methods = ('GET','OPTIONS','HEAD')

    def get_queryset(self):
        queryset = Term.objects.all()
        word = self.request.query_params.get('word', None)
        if word is not None:
            queryset = queryset.filter(word__iexact=word)
        return queryset

我需要的是避免在序列化程序中有两个相同的方法,如果我传递一个参数来过滤关系字段,那么我只能有一个(因为它们会这样做)。

我该怎么做?

提前致谢;)

1 个答案:

答案 0 :(得分:1)

我将你的obj添加到serializer's context并从你的方法中获取它。