【问题标题】:How to filter records based on nested data using django rest framework如何使用 django rest 框架根据嵌套数据过滤记录
【发布时间】:2017-06-16 20:37:50
【问题描述】:

我有这个基于 django rest 框架的客户 api 的 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__用户名

它的发生是因为 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

这是我的观点

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

请帮助我如何使用 username=john1 从客户 api 过滤我的记录

【问题讨论】:

    标签: django-rest-framework


    【解决方案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',)

    【讨论】:

      猜你喜欢
      • 2018-05-17
      • 1970-01-01
      • 2017-06-28
      • 1970-01-01
      • 2021-11-23
      • 1970-01-01
      • 2016-05-14
      • 2020-01-18
      相关资源
      最近更新 更多