2017-01-31 1 views
0

У меня есть ответ json от моего клиента api на основе рамки django rest.Как фильтровать записи на основе вложенных данных с помощью рамки django rest

Когда я ударил апи

http://localhost:8000/api/customers

я получать следующий ответ

[ 
{ 
    'name': 'Daniel', 
    'group': 'BK', 
    'user_id': 102, 
    'user_details': { 
     'username': 'dan1', 
     'active': true, 
    } 
}, 
{ 
    'name': 'John', 
    'group': 'BK', 
    'user_id': 103, 
    'user_details': { 
     'username': 'john1', 
     'active': true, 
    } 
} 
] 

Теперь мне нужно фильтровать записи которого имя пользователя = John1, как я могу это сделать?

Я попытался использовать это в моем клиентов режима просмотра путем определения фильтра бэкенд

filter_fields = ('user_details__username',)

и попытался ударяя апи как

http://localhost:8000/api/customers?user_details__username=john1

, но он дает ошибку как

«Meta.fields» содержит поля, которые не определены в этом FilterSet: user_details__username

Сво происходит потому, что user_details не поле моего клиента сериализатором, его в основном SerializerMethodField, который манипулирует информацией пользователя для отображения под клиентом api.

Вот мой клиент сериализатору

class CustomerSerializer(serializers.HyperlinkedModelSerializer): 
    user_details = serializers.SerializerMethodField('get_serialized_target_object') 

    class Meta: 
     model = Customer 
     fields = '__all__'   

    def get_serialized_target_object(self, obj): 
     usr_id = obj.user_id 
     if usr_id: 
      instance = User.objects.filter(pk=usr_id) 
      if instance: 
       instance = instance[0] 
       return UserSerializer(instance=instance).data 

     else: 
      return None 

и вот мой Viewset

class CustomerViewSet(viewsets.ModelViewSet): 
    queryset = Customer.objects.all() 
    serializer_class = CustomerSerializer 
    filter_fields = ('user_details__username',) 

Пожалуйста, помогите мне, как я могу фильтровать мои записи из апи клиента с именем пользователя = John1

ответ

0

Вы должны не использовать SerializerMethodField.

Попробуйте ниже сериалайзер:

class UserSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = User 
     fields = ('username', 'active',) 


class CustomerSerializer(serializers.ModelSerializer): 
    user_details = UserSerializer(many=True) 

    class Meta: 
     model = Customer 
     fields = '__all__' 

Затем вы можете определить поле filter_fields = ('user_details__username',)

Смежные вопросы