Как фильтровать по году, месяцу или дню в запросе django graphene

Я создаю django graphql api с graphene для событий фотографии. Каждое событие имеет местоположение, фотографа и дату события. Я хочу иметь возможность фильтровать все события по году, месяцу или дню, например, возвращать все события, происходящие в апреле 2022 года, или все события, которые происходят по четвергам. Я также хотел бы отфильтровать только будущие события. Модель:

# models.py

class Event(models.Model):
    STATUS = (
        ("Scheduled", "Scheduled"),
        ("Cancelled", "Cancelled"),
        ("Available", "Available"),
        ("Complete", "Complete"),
    )
    location = models.ForeignKey(
        Location, on_delete=models.SET_NULL, null=True, related_name="location_events"
    )
    photographer = models.ForeignKey(
        Photographer,
        on_delete=models.SET_NULL,
        null=True,
        related_name="photographer_events",
    )
    event_date = models.DateField()
    status = models.CharField(max_length=50, choices=STATUS, default="Scheduled")
    created = models.DateTimeField(auto_now_add=True)

    class Meta:
        constraints = [
            models.UniqueConstraint(
                name="location_event", fields=("location", "event_date")
            )
        ]

    def __str__(self):
        return f"Event {self.location}, {self.event_date}, {self.status}"
# schema.py

from graphene_django import DjangoObjectType
from graphene import relay, ObjectType
from graphene_django.filter import DjangoFilterConnectionField

from events.models import Event



class EventNode(DjangoObjectType):
    class Meta:
        model = Event
        filter_fields = {
            "event_date": ["exact", "year", "month", "day"],
            "status": ["exact"],
        }
        interfaces = (relay.Node,)

class EventsQuery(ObjectType):
    event = relay.Node.Field(EventNode)
    all_events = DjangoFilterConnectionField(EventNode)

При такой настройке, когда я пытаюсь выполнить этот запрос в интерфейсе браузера graphiql:

query filterEvents{
  allEvents(eventDate:"2022-02-14"){
    edges{
      node{
        id
        eventDate
        photographer{
          firstName
          lastName
        }
        location{
          id
          name
        }
      }
    }
  }
}

Это работает и дает мне события для этой конкретной даты.

Но когда я пытаюсь получить данные за месяц, день или год, я получаю следующие ошибки:

allEvents(eventDate_Year:"2022")
> "message": "['{\"event_date__year\": [{\"message\": \"Enter a number.\", \"code\": \"invalid\"}]}']",

allEvents(eventDate_Year:2022)
> "message": "Argument \"eventDate_Year\" has invalid value 2022.\nExpected type \"Date\", found 2022.",

allEvents(eventDate_Year:"2022-02-14")
> "message": "['{\"event_date__year\": [{\"message\": \"Enter a number.\", \"code\": \"invalid\"}]}']",

Я попробовал использовать django_filters следующим образом:

# schema.py
...
from django_filters import FilterSet

class EventFilter(FilterSet):
    class Meta:
        model = Event
        fields = "__all__"
        filter_fields = {
            "event_date": [
                "exact",
                "year",
                "month",
                "day",
            ],
            "status": ["exact"],
        }

class EventNode(DjangoObjectType):
    class Meta:
        model = Event
        filterset_class = EventFilter
        interfaces = (relay.Node,)

Этот метод не дает мне eventDate_Year, eventDate_Month и eventDate_Day дополнений, как предыдущий метод.
Как я могу этого добиться?

Вернуться на верх