Может ли graphene resolver возвращать Float вместо String для десятичного поля django?

Резольвер Graphene возвращает мое десятичное поле модели django в виде строки (например, "8.33" вместо 8.33). Я хочу получить его в виде числа с плавающей точкой. Есть ли какой-нибудь способ сделать это?

Мой код выглядит следующим образом:

models.py

class Toy(models.Model):
    name = models.CharField(max_length=50)
    price = models.DecimalField()

queries.py

class ToyType(DjangoObjectType):
    class Meta:
        model = Toy
        fields = ('name', 'price')

class ToyQuery(graphene.ObjectType):
    first_toy = graphene.Field(ToyType)
 
    def resolve_first_toy(self, info):
        return Toy.objects.first()

И мой запрос и результат таковы:

запрос

{
    firstToy{
        name
        price
    }
}

результат

{
    "data": {
         "name": "BuzzLighYear",
         "price": "19.95"

     } 
}

Вместо этого я хотел бы получить:

{
    "data": {
         "name": "BuzzLighYear",
         "price": 19.95

     } 
}

Нужно ли мне писать пользовательский резольвер для поля цены, или есть более элегантный способ сделать это с помощью настройки?

Чтобы преобразовать десятичное значение в плавающее, используйте пользовательский резольвер, как показано на рисунке.

class ToyType(DjangoObjectType):
    class Meta:
        model = Toy
        fields = ('name', 'price')

    price = graphene.Float()

    def resolve_price(self, info):
        return float(self.price)

Образец запроса и ответа

Оказывается, вам не нужно писать клиентский резольвер, а вместо этого можно просто объявить тип поля Django, например, так:

class ToyType(DjangoObjectType):

    price = graphene.Float()

    class Meta:
        model = Toy
        fields = ('name', 'price')

Таким образом, резольвер вернет цену как Float. Если вы явно не объявили тип, то по умолчанию графен возвращает поле django Decimal как строку.

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