python - 如何使用`django-filters`编写将在整数字段上使用范围过滤器的GraphQL查询?
问题描述
我正在使用graphene-python
,django-filters
并relay
在我的 GraphQL API 中。假设我有一个FrameType
具有整数字段的类型,time_offset
并且我希望能够在其上使用范围- 仅询问具有time_offset
给定范围内的帧。我schema.py
根据graphene-python 文档准备了我的自定义FilterSet
:
import django_filters
from graphene import ObjectType, relay
from graphene_django import DjangoObjectType, filter
from my_app.blabla import models
class FrameFilter(django_filters.FilterSet):
time_offset = django_filters.RangeFilter()
class Meta:
model = models.Frame
fields = ("time_offset",)
class FrameType(DjangoObjectType):
class Meta:
model = models.Frame
filterset_class = FrameFilter
interfaces = (relay.Node,)
class Query(ObjectType):
frames = filter.DjangoFilterConnectionField(FrameType)
class Meta:
abstract = True
但是,我现在不知道如何查询该timeOffset
字段。我在网上找不到该django_filters.RangeFilter
领域的示例。这是我尝试过的一个查询:
query Frame {
frames(first: 20, timeOffset: "{\"gt\":\"4350\", \"lt\":\"5000\"}") {
edges {
node {
timeOffset
}
}
}
......还有这些替代品:
timeOffset: "{\"gt\":4350, \"lt\":5000}"
timeOffset: "{\"start\":\"4350\", \"end\":\"5000\"}"
timeOffset: "{\"min\":\"4350\", \"max\": \"4500\"}"
timeOffset: "[\"4350\", \"5000\"]"
timeOffset: "[4350, 5000]"
timeOffset: "[4350]"
timeOffset: "4350,5000"
这些查询不会引发任何错误,但它们也不会过滤(返回所有结果)。我迷路了,我不确定我是否还没有找到正确的语法,或者我的后端代码中可能有一些错误。我应该如何使用和查询django_filters.RangeFilter
字段?
解决方案
可悲的是,这是不可能的。但是,有一个解决方法
将您的过滤器类调整为
def custom_range_filter_method(queryset, field_name, value):
if value:
queryset = queryset.filter(**{f'{field_name}__range': value.split(',')})
return queryset
class FrameFilter(django_filters.FilterSet):
time_offset = filters.Filter(method=custom_range_filter_method)
class Meta:
model = models.Frame
fields = ("time_offset",)
现在查询架构
query Frame {
frames(first: 20, timeOffset: "4350,5000") {
edges {
node {
timeOffset
}
}
}
参考
推荐阅读
- python - 如何打开文本文件并查找一行中特定单词之后写的内容并将该文件名附加到 Python 中的列表中
- c++ - 非捕获 lambda 和函数指针作为重载函数歧义中的参数
- c# - 在 Dot Net Core 2.2 SignalR 中通过 ConnectionId 发送并行数据
- c++ - 如何计算二叉树中所有节点两边的节点数
- ionic3 - ionic 3 中的边框图像不起作用?如何在 ionic 3 中使用它
- google-cloud-platform - 您如何查明是谁冒充了 GCP 服务帐号?
- python - 将数据帧传递给线程
- c - 使用 dup2() 和 execve() 重定向
- domain-driven-design - DDD - 将商品添加到订单/收据时的价格计算
- html - 引导阴影未显示在 nav.shadow 上