python - Django按序列化方法字段过滤
问题描述
我无法创建一些逻辑(对我来说很有趣)。例如我有这样的视图:
class DucktList(generics.ListAPIView):
serializer_class = DuckSerializer
filter_backends = (DjangoFilterBackend,)
filter_fields = ('test_field',) // i want to create some custom field and filter by it if needed.
序列化器:
class DuckSerializer(serializers.ModelSerializer):
test_field = SerializerMethodField() // i want filter by this field!
def get_test_field(self, obj):
return True
class Meta:
......
我如何filter_fields
过滤test_field
?
解决方案
也许您可以使用自定义方法定义自己的过滤器并使用此库django-filters:
from django_filters import rest_framework as filters
class EventFilter(filters.FilterSet):
finish_on = filters.BooleanFilter(name='finish_on', method='filter_manifestation')
begin_on = filters.BooleanFilter(name='begin_on', method='filter_manifestation')
def filter_manifestation(self, queryset, name, value):
if value is False:
lookup = '__'.join([name, 'gte'])
else:
lookup = '__'.join([name, 'lte'])
qs = queryset.filter(**{lookup: timezone.now()})
return qs
class Meta:
model = Event
fields = [
'finished', 'has_begun'
]
并将此过滤器添加到您的视图中:
class ManifestationViewSet(viewsets.ReadOnlyModelViewSet):
...
filter_class = EventFilter
...
然后,您可以根据您想要在序列化程序自定义字段的相关功能中执行的操作来调整过滤器的自定义方法。
您在 django-filter 库文档中有一些关于各种过滤器类型的片段。
推荐阅读
- javascript - 对 API 的异步映射函数调用返回一个未定义的数组
- project - 为 Sidekick 复制项目
- r - 新增内容:在 R 中使用 For & If 语句识别局部最大值
- haskell - 使用管道序列化源
- date - Flask SocketIO 在 OS 日期更改时断开连接
- python - 有没有办法检查 PyQt5 中的菜单选项是否更改?
- linux - 在 bash 脚本的 if 语句中使用 traceroute
- php - 获取所有文本,但不获取正则表达式匹配
- javascript - pupeteer 调试:查找哪一行导致错误
- java - 用于在 Java 中将 .txt 文件转换为 .csv 的解析器