我在我的graphene-python API中使用django-filters和relay。让我们假设我有一个类型的FrameType,它有一个整数字段time_offset,并且我希望能够在它上使用一个范围--只要求在给定范围内有time_offset的帧。我用自定义的schema.py根据石墨烯-python文档准备了石墨烯-python文档
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?
发布于 2020-12-09 13:18:47
您可以在Django的queryset级别处理range选项,而不会干扰现有的中继查询。
在你的情况下
start_time_offset和end_time_offset参数传递给DjangoConnectionFieldresolve_framesstart_time_offset或end_time_offset,则对django queryset进行筛选,返回objects.all()class Query(ObjectType):
frames = filter.DjangoFilterConnectionField(FrameType, start_time_offset=graphene.Int(), end_time_offset=graphene.Int())
def resolve_frames(self, info, start_time_offset=None, end_time_offset=None, **kwargs):
if start_time_offset and end_time_offset:
return Frame.objects.filter(time_offset__range=(start_time_offset, end_time_offset))
elif start_time_offset:
return Frame.objects.filter(time_offset__gte=start_time_offset)
elif end_time_offset:
return Frame.objects.filter(time_offset__lte=end_time_offset)
return Frame.objects.all()现在,您可以使用中继提供的常规过滤器对其进行查询:
query Frame {
frames(last: 5, startTimeOffset: 4350, endTimeOffset:5000) {
edges {
node {
timeOffset
}
}
}发布于 2021-02-06 09:30:20
它有点老了,但是因为它可能对其他人有帮助,所以您可以检查这个线程,它对DateRangeFiled使用django过滤器集,我认为您可以对使用filterset RangeFilter的整数使用类似的方法。还可以查看这,以获得有关石墨烯过滤器集的更多信息。
发布于 2021-10-26 15:24:21
您所需要做的就是按以下方式更新您的FrameType类:
class FrameType(DjangoObjectType):
class Meta:
model = models.Frame
filterset_fields = {
'time_offset': ['range']
}
interfaces = (relay.Node,)为此您不需要一个自定义的过滤器集。然后您可以按以下方式查询:
query Frame {
frames(first: 20, timeOffset_Range: ["4350", "5000"]) {
edges {
node {
timeOffset
}
}
}https://stackoverflow.com/questions/64158489
复制相似问题