首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何编写使用‘`django filter’在整数字段上使用范围筛选器的GraphQL查询?

如何编写使用‘`django filter’在整数字段上使用范围筛选器的GraphQL查询?
EN

Stack Overflow用户
提问于 2020-10-01 15:25:59
回答 3查看 1.8K关注 0票数 0

我在我的graphene-python API中使用django-filtersrelay。让我们假设我有一个类型的FrameType,它有一个整数字段time_offset,并且我希望能够在它上使用一个范围--只要求在给定范围内有time_offset的帧。我用自定义的schema.py根据石墨烯-python文档准备了石墨烯-python文档

代码语言:javascript
复制
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字段的示例。这是我尝试过的一个查询:

代码语言:javascript
复制
query Frame {
  frames(first: 20, timeOffset: "{\"gt\":\"4350\", \"lt\":\"5000\"}") {
    edges {
      node {
        timeOffset
    }
  }
}

..。此外,在这些备选办法中:

代码语言:javascript
复制
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

EN

回答 3

Stack Overflow用户

发布于 2020-12-09 13:18:47

您可以在Django的queryset级别处理range选项,而不会干扰现有的中继查询。

在你的情况下

  1. start_time_offsetend_time_offset参数传递给DjangoConnectionField
  2. 覆盖resolve_frames
  3. 如果用户提供了start_time_offsetend_time_offset,则对django queryset进行筛选,返回objects.all()
代码语言:javascript
复制
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()

现在,您可以使用中继提供的常规过滤器对其进行查询:

代码语言:javascript
复制
query Frame {
  frames(last: 5, startTimeOffset: 4350, endTimeOffset:5000) {
    edges {
      node {
        timeOffset
    }
  }
}
票数 1
EN

Stack Overflow用户

发布于 2021-02-06 09:30:20

它有点老了,但是因为它可能对其他人有帮助,所以您可以检查这个线程,它对DateRangeFiled使用django过滤器集,我认为您可以对使用filterset RangeFilter的整数使用类似的方法。还可以查看,以获得有关石墨烯过滤器集的更多信息。

票数 0
EN

Stack Overflow用户

发布于 2021-10-26 15:24:21

您所需要做的就是按以下方式更新您的FrameType类:

代码语言:javascript
复制
class FrameType(DjangoObjectType):
    class Meta:
        model = models.Frame
        filterset_fields = {
            'time_offset': ['range']
        }
        interfaces = (relay.Node,)

为此您不需要一个自定义的过滤器集。然后您可以按以下方式查询:

代码语言:javascript
复制
query Frame {
    frames(first: 20, timeOffset_Range: ["4350", "5000"]) {
    edges {
      node {
        timeOffset
    }
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64158489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档