首页 > 解决方案 > 带注释字段的 django-filter 过滤器

问题描述

class EventViewSet(viewsets.ModelViewSet):
    queryset = Event.objects.all()
    serializer_class = EventSerializer

    def get_queryset(self):
        return super().get_queryset().annotate(
            is_active=ExpressionWrapper(
                Q(start_date__lt=timezone.now()) & Q(end_date__gt=timezone.now()),
                output_field=BooleanField()
            ),
        )

    search_fields = [
        'name',
        'short_desc',
        'desc',
    ]

    filterset_fields = [
        'is_active',
    ]

我有这个视图集,我想在一个带注释的字段上进行过滤,通常你可以简单地过滤 django 查询集中的注释,但是上面结合了这个序列化程序:

class EventSerializer(serializers.ModelSerializer):
    is_active = serializers.SerializerMethodField()

    @staticmethod
    def get_is_active(obj):
        return obj.is_active

    class Meta:
        model = Event
        fields = [
            'timestamp',
            'id',
            'name',
            'short_desc',
            'desc',
            'start_date',
            'end_date',
            'is_active',
        ]

我没有深入研究源代码,但我认为它会为字段做一个简单的 qs.filterfilterset_fields但我得到了这个美丽的错误,无法解释很多(至少对我来说):

'Meta.fields' contains fields that are not defined on this FilterSet: is_active

标签: pythondjangodjango-rest-framework

解决方案


显然,您根本没有在 Meta.fields 列表中添加声明的过滤器。从字面上看,在文档中,我通过阅读代码发现了它。

此外,当向declare_fields AKA过滤器类主体添加带注释的字段时,添加标签或 django-filters 无法正确生成字段标签,而只会使用“无效名称”而不是您知道的字段名称。谁知道为什么。


推荐阅读