2017-01-31 30 views
0

私はこのdjango restフレームワークに基づく顧客APIからのjson応答を持っています。私は、APIdjango rest frameworkを使用してネストされたデータに基づいてレコードをフィルタリングする方法

http://localhost:8000/api/customers

を打つとき

私は今、私はそのユーザ名= john1、私はそれをどのように行うか、レコードをフィルタリングする必要があり、次の応答

[ 
{ 
    '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, 
    } 
} 
] 

を受けますか?

私は、フィルタのバックエンドを定義することによって、私の顧客のビューセットでこれを使用して試してみました=( 'user_details__username'、)

filter_fields

http://localhost:8000/api/customers?user_details__username=john1としてAPIを打ってみました

しかし

「Meta.fields」は、このフィルタセットに定義されていないフィールドが含まれているとして、それはエラーを与える: user_details__username

user_detailsはその基本的に、私の顧客のシリアライザのフィールドではありませんので、そのが起こっSerializerMethodField:顧客情報を操作して顧客APIの下に表示します。どのように私はあなたがユーザ名= john1

答えて

0

を顧客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 

であり、ここで私のビューセットは

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

であるべきです使用しないでください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',)

として、あなたのフィールドを定義することができます
関連する問題