我的客户api基于django rest框架得到了这个json响应。
当我点击api时
我收到以下回复
[
{
'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过滤我的记录答案 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',)