Python 从另一个模型计算Django模型中的数字';s数据

Python 从另一个模型计算Django模型中的数字';s数据,python,django,Python,Django,我想从每个用户的字段中获取数据(amount\u spended),然后将这些数据相加,并将它们显示在另一个不同型号(RevenueInfo)的字段中(total\u revenue) 我该怎么做呢?我会迭代每个用户模型,找到用户.花费的金额,然后将其添加到收入信息.总收入?我不知道如何将其转化为代码。另外,我很确定我不需要花费的总金额和总收入,但我觉得我需要一个外键是的,你可以在你的模型中为此编写一个方法。有两种方法。 1) 编写计算值并将其设置为实例值的方法。 2) 编写一个计算值并直接返回

我想从每个用户的字段中获取数据(
amount\u spended
),然后将这些数据相加,并将它们显示在另一个不同型号(
RevenueInfo
)的字段中(
total\u revenue


我该怎么做呢?我会迭代每个
用户
模型,找到
用户.花费的金额
,然后将其添加到
收入信息.总收入
?我不知道如何将其转化为代码。另外,我很确定我不需要花费的
总金额
总收入
,但我觉得我需要一个
外键
是的,你可以在你的模型中为此编写一个方法。有两种方法。 1) 编写计算值并将其设置为实例值的方法。 2) 编写一个计算值并直接返回的方法

例如,这里是第二种类型的代码

# models.py
def total_amount_spent(self):
    temp_values = [int(user.amount_spent) for user in ExtendedProfile.objects.all()]
    return sum(temp_values)
用于在视图中使用该值,但请记住,默认情况下它将是一个整数

#views.py
value = RevenueInfo.total_amount_spent()

是的,您可以在模型中为此编写一个方法。有两种方法。 1) 编写计算值并将其设置为实例值的方法。 2) 编写一个计算值并直接返回的方法

例如,这里是第二种类型的代码

# models.py
def total_amount_spent(self):
    temp_values = [int(user.amount_spent) for user in ExtendedProfile.objects.all()]
    return sum(temp_values)
用于在视图中使用该值,但请记住,默认情况下它将是一个整数

#views.py
value = RevenueInfo.total_amount_spent()

避免在python中迭代数据库实体(它可能会变得非常慢)。查看,它允许您高效地获取数据库中的值的总和(平均值、最大值、最小值等):

>>> from django.db.models import Sum
>>> ExtendedProfile.objects.all().aggregate(Sum('amount_spent'))
{'amount_spent__sum': Decimal('1234.56')}
>>> # ... do whatever you want with the return value

避免在python中迭代数据库实体(它可能会变得非常慢)。查看,它允许您高效地获取数据库中的值的总和(平均值、最大值、最小值等):

>>> from django.db.models import Sum
>>> ExtendedProfile.objects.all().aggregate(Sum('amount_spent'))
{'amount_spent__sum': Decimal('1234.56')}
>>> # ... do whatever you want with the return value

您可以将
classmethod
添加到
ExtendedProfile
模型中,以聚合每个用户的
花费金额
值(这样就不需要单独的
RevenueInfo
模型):

然后,您可以使用ExtendedProfile.total\u user\u Expense()获取总开支:


您可以将
classmethod
添加到
ExtendedProfile
模型中,以聚合每个用户的
花费金额
值(这样就不需要单独的
RevenueInfo
模型):

然后,您可以使用ExtendedProfile.total\u user\u Expense()获取总开支:


很抱歉回复太晚,谢谢你的回复。但是,在管理页面/实际字段中显示这一点的最佳方式是什么?基本上,我需要类似于
models.DecimalField('amount\u spended
)的东西。显然这不起作用,但你知道我的意思,需要澄清才能完全理解你。如果这是为了参考和与单个用户字段进行比较,那么您可以通过在django admin中使用
fieldset
添加描述来显示ExtendedProfile表单上的总花费,例如:class ExtendedProfileAdmin(admin.ModelAdmin):fieldset=[(无,{'fields':('user',)}),(“用户支出总额为{}.format(ExtendedProfile.Total_user_-spend()['Total']),{'fields':('amount_-spend',),}),]admin.site.register(ExtendedProfile,ExtendedProfileAdmin)一旦声明为
classmethod
您就可以使用
ExtendedProfile.Total_-user_-spend()
在任何视图中,无论是在模板中还是在管理页面上,都可能不需要在数据库中保存该值,除非您有特殊原因。但是,如果您愿意这样做,那么每次更新ExtendedProfile时,都将该值设置为
total\u user\u spend
。您可以通过信号或重写save方法来实现这一点。还可以从Python文档中看到:“类方法接收类作为隐式的第一个参数,就像实例方法接收实例一样。”使用它来处理类本身,而不是它的任何特定实例——在这种情况下,我们希望所有用户,而不是单个用户。然而,默认情况下,类方法的第一个参数是对类的当前实例的引用,按照约定称为“self”,而这里称为“cls”。比较
@classmethod
@property
@staticmethod
。很抱歉回复太晚,谢谢你的回复。但是,在管理页面/实际字段中显示这一点的最佳方式是什么?基本上,我需要类似于
models.DecimalField('amount\u spended
)的东西。显然这不起作用,但你知道我的意思,需要澄清才能完全理解你。如果这是为了参考和与单个用户字段进行比较,那么您可以通过在django admin中使用
fieldset
添加描述来显示ExtendedProfile表单上的总花费,例如:class ExtendedProfileAdmin(admin.ModelAdmin):fieldset=[(无,{'fields':('user',)}),(“用户支出总额为{}.format(ExtendedProfile.Total_user_-spend()['Total']),{'fields':('amount_-spend',),}),]admin.site.register(ExtendedProfile,ExtendedProfileAdmin)一旦声明为
classmethod
您就可以使用
ExtendedProfile.Total_-user_-spend()
在任何视图中,无论是在模板中还是在管理页面上,都可能不需要在数据库中保存该值,除非您有特殊原因。但是,如果您愿意这样做,那么每次更新ExtendedProfile时,都将该值设置为
total\u user\u spend
。您可以通过信号或重写save方法来实现这一点。还可以从Python文档中看到:“类方法接收类作为隐式的第一个参数,就像实例方法接收实例一样。”使用它来处理类本身,而不是它的任何特定实例——在这种情况下,我们希望所有用户,而不是单个用户。而类method的第一个参数