Как сделать запрос 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

Вызов запроса должен быть одинаковым.

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