如何使用django rest框架基于嵌套数据过滤记录

时间:2017-01-31 12:01:32

标签: django-rest-framework

我的客户api基于django rest框架得到了这个json响应。

当我点击api时

  

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',)

尝试点击api

  

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

但它会出错

  

'Meta.fields'包含未在此FilterSet上定义的字段:   user_details__username

它的发生是因为user_details不是我的客户序列化程序的字段,它基本上是SerializerMethodField,它操纵用户信息显示在customer 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',)

请帮助我如何使用username = john1

从客户api过滤我的记录

1 个答案:

答案 0 :(得分:1)

您不应该使用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',)