Как фильтровать по году, месяцу или дню в запросе 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 дополнений, как предыдущий метод.
Как я могу этого добиться?