首页 > 解决方案 > DjangoRestAPI 过滤列表字段

问题描述

在我的 DjangoRestAPI 项目中,我有 2 个这样的序列化器:

序列化程序.py

class TagSerializer(serializers.ModelSerializer):

    class Meta:
        model = Tags
        fields = ['tagkey', 'tagval']

    def create(self, validated_data):

        return Tags.objects.create(**validated_data)

    def update(self, instance, validated_data):
        instance.tagkey = validated_data.get('tagkey', instance.tagkey)
        instance.tagval = validated_data.get('tagval', instance.tagval)

        instance.save()
        return instance


class ModvarSerializer(serializers.ModelSerializer):
    owner = serializers.ReadOnlyField(source='owner.username')
    var_group = VarGroupSerializer(read_only=True)
    tag_var = TagSerializer(read_only=True, many=True)

    class Meta:
        model = ModbusVariable
        fields = ['id', 'short_name', 'uom', 'var_group', 'unit', 'writeable', 'value_class', 'address', 'bit_count', 'min_type','max_type', 'byte_order','function_code_read', 'is_quarterly', 'tag_var', 'owner']

    def create(self, validated_data):
        ...

现在在我的views.py中,我必须为tag_var值创建一个带有过滤器的ModVar列表:

视图.py

class ModvarsList(generics.ListCreateAPIView):
    queryset = ModbusVariable.objects.using(random.choice(replica_list)).all()
    serializer_class = ModvarSerializer
    permission_classes = [permissions.IsAuthenticatedOrReadOnly]
    pagination_class = StandardResultsSetPagination
    # paginator = None
    filter_backends = [DjangoFilterBackend]
    filterset_fields = {
        'unit__port_id__master_id': ['exact'],
        'unit__port_id__master_id__short_name': ['exact'],
        'is_quarterly': ['exact'],
        'tag_var': ['exact']
    }
    search_fields = ['unit__port_id__master_id', 'unit__port_id__master_id__short_name', 'is_quarterly']
    ordering_fields = '__all__'

所以如果我在没有过滤器的情况下运行我的 API 调用,我会得到以下结果:

在此处输入图像描述

但是,如果我尝试使用例如 tag_var="tagkey: site1" 或仅使用 "site1" 进行过滤,我会收到错误消息

tag_var 过滤器的值不正确

如何仅公开 tag_val 值的“键”和“值”字段以根据我的 API 结果的值进行过滤?

非常感谢曼努埃尔

标签: python-3.xdjangoapidjango-rest-framework

解决方案


推荐阅读