【问题标题】:Casting inside a django query在 django 查询中进行投射
【发布时间】:2021-10-11 08:03:42
【问题描述】:

我有一个具有两个属性的模型

class Player(models.Model):
    username = models.CharField(max_length=200, unique=True)
    score = models.CharField(max_length=50)

我希望分数保持为 CharField,但现在我想通过这样的简单查询来平均所有玩家的分数

Player.objects.aggregate(Avg('score'))

这不起作用,因为“score”是一个 CharField,需要先转换为浮点数。我如何进行动态类型转换?提前谢谢你。

【问题讨论】:

  • 为什么scoreCharField,而不是IntegerField/FloatField?将其转换为数字对于数据库来说会非常昂贵,因为将 string 解析为 int 并不是那么快。
  • 我在游戏后期才加入这个项目,我不确定,但我认为这与 pymongo 不喜欢这些类型有关。现在,我需要实现一个简单的功能,稍后我会在了解该更改的含义时解决该问题。谢谢

标签: python-3.x django django-models


【解决方案1】:

我认为你可以像这样使用“Cast”:

from django.db.models.functions import Cast
Player.objects.annotate(score_as_float=Cast('score', 
output_field=FloatField()).aggregate(Avg('score_as_float'))

来源:https://docs.djangoproject.com/en/4.0/ref/models/database-functions/#cast

How to make sum query with type casting and calculation in django views?

【讨论】:

    猜你喜欢
    • 2020-02-11
    • 2016-04-15
    • 1970-01-01
    • 2015-08-20
    • 1970-01-01
    • 2011-02-25
    • 2018-05-21
    • 1970-01-01
    • 2012-01-23
    相关资源
    最近更新 更多