python - 带注释字段的 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
解决方案
显然,您根本没有在 Meta.fields 列表中添加声明的过滤器。从字面上看,在文档中,我通过阅读代码发现了它。
此外,当向declare_fields AKA过滤器类主体添加带注释的字段时,添加标签或 django-filters 无法正确生成字段标签,而只会使用“无效名称”而不是您知道的字段名称。谁知道为什么。
推荐阅读
- python - 熊猫的 get_dummies 由于这个看不见的数据问题
- mysql - 使用大于和小于函数编写 SQL 代码
- node.js - PaperJS 从本地文件导入SVG
- c++ - 错误代码 = 0x80070002 (MS Visual Studio) C++
- python - DRF(django-rest-framework)动作装饰器不起作用
- java - Android应用程序(java)的结构不断扫描蓝牙设备
- php - 正则表达式从文件中分割行
- ruby-on-rails - change hash key through function call
- java - Java FileReader 即使使用绝对路径也找不到文件
- c# - How can I control the display order of child Forms in a MDI Form