如何在Graphene中使用django-filter的DateTimeFromToRangeFilter?

bakd9h0s  于 2023-10-21  发布在  Go
关注(0)|答案(1)|浏览(128)

我尝试将django-filter的DateTimeFromToRangeFilter示例与自定义FilterSet结合使用。但是,当我尝试执行以下操作时,这并不起作用:

class CustomFilterSet(FilterSet):
    modified = django_filters.IsoDateTimeFromToRangeFilter()

    class Meta:
        fields = "__all__"
        model = Custom

这不会导致创建额外的字段或注解,就像我期望的那样。例如:

f = F({'modified_after': '...', 'modified_before': '...'})

如果我检查添加到DjangoFilterConnectionField的单个字段(modified),我会看到以下内容:

{'creation_counter': 395, 'name': None, '_type': <String meta=<ScalarOptions name='String'>>, 'default_value': Undefined, 'description': None, 'deprecation_reason': None}

那么,我如何配置这个过滤器,这样我就可以写一个像下面这样的查询?

query {
    allTheSmallThings(
        modified_before: "2023-09-26 17:21:22.921692+00:00"
    ) {
        edges {
            node {
                id
            }
        }
    }
}

更新:我可以确认我能够使用文件中的FilterSet子类。这个问题似乎与石墨烯生成/不生成的字段有关。

nkkqxpd9

nkkqxpd91#

要在Graphene-Django中使用自定义FilterSet过滤DateTime字段,您可以按照以下步骤操作:
1.在自定义FilterSet类中使用django-filter中的IsoDateTimeFromToRangeFilter定义自定义DateTime过滤器字段。
1.确保您定义的过滤器字段名称与您将在GraphQL查询中使用的名称匹配。
1.确保您的GraphQL schema正确包含自定义FilterSet和字段名称。
下面是如何修改代码来实现这一点:
假设你有一个名为Custom的模型,下面是你如何定义一个自定义的FilterSet并将其集成到你的GraphQL模式中:

import django_filters
import graphene
from graphene import relay
from graphene_django.filter import DjangoFilterConnectionField
from graphene_django.types import DjangoObjectType

from .models import Custom  # Import your Custom model here

class CustomFilterSet(django_filters.FilterSet):
    modified_before = django_filters.IsoDateTimeFilter(
        field_name='modified', lookup_expr='lte'
    )
    modified_after = django_filters.IsoDateTimeFilter(
        field_name='modified', lookup_expr='gte'
    )

    class Meta:
        model = Custom
        fields = []

class CustomNode(DjangoObjectType):
    class Meta:
        model = Custom
        interfaces = (relay.Node,)

class Query(graphene.ObjectType):
    all_the_small_things = DjangoFilterConnectionField(
        CustomNode, filterset_class=CustomFilterSet
    )

schema = graphene.Schema(query=Query)

有了这个设置,你可以在GraphQL查询中使用modified_beforemodified_after过滤器,如下所示:

query {
    allTheSmallThings(
        modified_before: "2023-09-26T17:21:22.921692Z"
    ) {
        edges {
            node {
                id
                # Add other fields you want to retrieve
            }
        }
    }
}

请确保调整CustomFilterSet中的field_namelookup_expr值,以匹配模型的字段名称和要应用的过滤条件。
此外,确保您已经导入了必要的模块并正确设置了GraphQL模式。

相关问题