Как сделать запрос graphql, который может найти "latest" или "min" или "max"
Я пытаюсь использовать graphql с python для получения последнего элемента, добавленного в таблицу температур. Таблица температуры имеет 2 столбца: метка времени и значение.
Мой models.py имеет следующий вид:
from django.db import models
class Temperature(models.Model):
timestamp = models.DateTimeField(auto_now=True)
value = models.FloatField()
def __str__(self):
return f"the value:time is {self.value}:{self.timestamp}"
а schema.py это:
import graphene
from graphene_django import DjangoObjectType
from temperature import models
class Temperature(DjangoObjectType):
class Meta:
model = models.Temperature
class Query(graphene.ObjectType):
temperature = graphene.Field(Temperature, id=graphene.Int())
def resolve_temperature(self, info, **kwargs):
id = kwargs.get("id")
if id is not None:
return models.Temperature.objects.get(pk=id)
return None
schema = graphene.Schema(query=Query)
Я хочу сделать один запрос, который возвращает последнюю добавленную температуру, примерно так:
query {
currentTemperature {
timestamp
value
}
}
А другой запрос, который возвращает минимальную и максимальную температуру за определенный промежуток времени, выглядит так:
query {
temperatureStatistics(after: "2020-12-06T12:00:00+00:00", before: "2020-12-07T12:00:00+00:00") {
min
max
}
}
У меня большие проблемы с поиском документации о том, как этого добиться.
Я просмотрел эту документацию по graphql и этот пост на stackoverflow. Я просмотрел и другие вещи, но это единственное, что приблизилось к помощи.
Вы можете определить новый тип с min и max, а затем добавить его в запрос следующим образом:
class RangeType(graphene.ObjectType):
min = grahene.String()
max = grahene.String()
class Query(graphene.ObjectType):
temperature_statistics = graphene.Field(
RangeType, before=graphene.String(), after=graphene.String()
)
def resolve_temperature_statistics(self, info, before=None, after=None):
range_type = RangeType()
range_type.min = # query to get min value
range_type.max = # query to get max value
return range_type
Вызов запроса должен быть одинаковым.