Django queryset域上的数学

Django queryset域上的数学,django,django-models,Django,Django Models,我有以下Django型号: class Accounts(models.Model): account_code = models.CharField(max_length=12) account_name = models.CharField(max_length=50) value = models.DecimalField(max_digits=10, decimal_places=2) 查询数据库时,我希望返回的查询集的字段值除以1000。 在查询数据库时,如何

我有以下Django型号:

class Accounts(models.Model):
    account_code = models.CharField(max_length=12)
    account_name = models.CharField(max_length=50)
    value = models.DecimalField(max_digits=10, decimal_places=2)
查询数据库时,我希望返回的查询集的字段
除以1000。
在查询数据库时,如何对模型字段进行这种计算?

我不确定在查询集中是否可以这样做,即使使用注释(我实际上非常确定这是不可能的)。我的第一个答案是空间效率低下,因为您必须以两种形式存储相同的值,而我的第二个答案是我将要做的,并使用前端处理除法:

回答一:第二个值字段

在您的模型中,您可以定义一个字段
格式化的_值
,该字段也是一个小数,但有6位小数(以说明除以1000的情况)。在
save
功能中,或在
pre\u save
信号中,您可以将
除以1000,并将其保存在
格式化值
字段中

这个答案是次优的,因为您将浪费数据库中的空间。我认为更好的答案是:

答案二:查看或前端处理

在我的项目中,我经常需要操纵数据库中的数字来输出某种分析工具。我将原始数字返回到前端(只要它们不敏感),然后使用Javascript在前端处理数学运算。这将计算负担传递给客户机,并简化了Django。这样做的好处是,您可以使前端具有交互性,并允许用户更改影响他们正在查看的分析的值


我觉得你在找更简单的东西。如果您有一个视图总是需要返回
值/1000
,您可以在视图中处理此问题,方法是使用
Accounts.objects.all()
获取
帐户列表,然后循环遍历每个帐户并将
值除以1000。

我不确定这在查询集中是否确实可行,甚至使用注释(实际上我非常确定这是不可能的)。我的第一个答案是空间效率低下,因为您必须以两种形式存储相同的值,而我的第二个答案是我将要做的,并使用前端处理除法:

回答一:第二个值字段

在您的模型中,您可以定义一个字段
格式化的_值
,该字段也是一个小数,但有6位小数(以说明除以1000的情况)。在
save
功能中,或在
pre\u save
信号中,您可以将
除以1000,并将其保存在
格式化值
字段中

这个答案是次优的,因为您将浪费数据库中的空间。我认为更好的答案是:

答案二:查看或前端处理

在我的项目中,我经常需要操纵数据库中的数字来输出某种分析工具。我将原始数字返回到前端(只要它们不敏感),然后使用Javascript在前端处理数学运算。这将计算负担传递给客户机,并简化了Django。这样做的好处是,您可以使前端具有交互性,并允许用户更改影响他们正在查看的分析的值


我觉得你在找更简单的东西。如果您的视图总是需要返回
值/1000
,您可以通过使用
Accounts.objects.all()获取
帐户列表来处理此问题
然后循环遍历每个属性并将
除以1000。

您可以使用
属性
装饰器在模型上定义属性。此属性不会在数据库中定义,但在查询每个对象时都可以访问

例如:

class Accounts(models.Model):
    account_code = models.CharField(max_length=12)
    account_name = models.CharField(max_length=50)
    value = models.DecimalField(max_digits=10, decimal_places=2)

    @property
    def divided_value(self):
        return self.value / 1000

然后,您可以将每个帐户实例上的
分割值
作为普通属性访问,例如
帐户。分割值

您可以使用
属性
装饰器在模型上定义属性。此属性不会在数据库中定义,但在查询每个对象时都可以访问

例如:

class Accounts(models.Model):
    account_code = models.CharField(max_length=12)
    account_name = models.CharField(max_length=50)
    value = models.DecimalField(max_digits=10, decimal_places=2)

    @property
    def divided_value(self):
        return self.value / 1000

然后,您可以将每个帐户实例上的
divided_值
作为普通属性访问,例如同一属性中的
account.divided_值

?因为首先,这不再是一个
整数
,而且它会让一切变得更加混乱。如果需要存储值,可以使用
十进制字段
,该字段根据定义的精度存储数字。编辑以更改为十进制字段。谢谢当我执行
Accounts.objects.all()
Queryset中的所有
values
条目将被除以1000。您将如何使用这个除以的值?在同一属性中?因为首先,这不再是一个
整数
,而且它会让一切变得更加混乱。如果需要存储值,可以使用
十进制字段
,该字段根据定义的精度存储数字。编辑以更改为十进制字段。谢谢当我做
Accounts.objects.all()
Queryset中的所有
values
条目将被除以1000。你将如何使用这个除以的值?我将尝试你上一段中的方法。我想这行得通。我试试你上一段的方法。我想它会有用的。