2016-01-12 10 views
1

Я определил сериалайзер, используя следующий код:Pass аргумент в методе вызывается через SerializerMethodField

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_assocVocabs и get_equivVocabs. Они точно такие же, какие изменения являются значением отношения в фильтре, 1 - фильтровать связанные словары, а 2 - получать эквивалентные слова.

Кстати, это мой Viewset:

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 

Что мне нужно, чтобы избежать двух одинаковых методов внутри сериализатором, когда я могу иметь только один (потому что они делают то же самое), если я прохожу аргумент для фильтрации поля отношения.

Как это сделать?

Заранее спасибо;)

+0

Есть ли какое-либо отношение между 'RelationTerm.relation' и объектом' Term'? – mariodev

+0

Я просто хочу знать, как передать аргумент методу get_assocVocabs, используя SerializerMethodField. Зачем тебе это знать? – Falcoa

ответ