【问题标题】:django-filter filter on annotated field带注释字段的 django-filter 过滤器
【发布时间】:2021-09-04 17:39:54
【问题描述】:
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',
    ]

我有这个 ViewSet,我想过滤一个带注释的字段,通常你可以简单地过滤 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',
        ]

我没有深入研究源代码,但我认为它会为 filterset_fields 中的字段执行一个简单的 qs.filter,但我得到了这个无法解释的漂亮错误(至少我):

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

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2020-03-11
      • 2012-04-05
      • 2018-12-23
      • 1970-01-01
      • 2011-06-04
      • 2021-12-20
      • 2018-12-30
      • 2013-10-30
      • 1970-01-01
      相关资源
      最近更新 更多