Может ли 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 как строку.