使用Django ORM值并调用成员函数

使用Django ORM值并调用成员函数,django,django-orm,Django,Django Orm,我的Django应用程序中有以下模型 class Revenue(models.Model): from_a = models.IntegerField() from_b = models.IntegerField() def get_total(self): return self.from_a + self.from_b 现在我正在使用Revenue.objects.filter(from_a_gt=10).value('from_a','from

我的Django应用程序中有以下模型

class Revenue(models.Model):
    from_a = models.IntegerField()
    from_b = models.IntegerField()

    def get_total(self):
        return self.from_a + self.from_b
现在我正在使用
Revenue.objects.filter(from_a_gt=10).value('from_a','from_b')
检索数据

从上面的查询集中我得到了值,现在我想调用对象上的
get\u total
函数。 我没有找到调用该函数的方法

是否有方法仅使用
检索我需要的数据,并且还可以调用该对象的
成员函数


Revenue.objects.filter(from_a_gt=10)
如果我的模型有100个列,那么它不应该是解决方案。

您可以在查询中使用,而不是在模型级别执行此操作:

from django.db.models import F

Revenue.objects.filter(from_a__gt = 10).annotate(
    get_total=F('from_a') + F('from_b')
).values('from_a', 'from_b', 'get_total')
从上面的查询集中我得到了值,现在我想调用对象上的
get\u total
函数。我没有找到调用该函数的方法

您将获得一个
QuerySet
(在该点上未进行评估),因此,
Revenue
s的集合。不能直接调用该集合上的函数。但是您可以迭代查询集,并对INIDVIDEAL对象调用该函数。例如,我们可以列出以下内容:

[r.get_total() for r in Revenue.objects.filter(from_a__gt = 10)]
这将构造
Revenue
对象,但我们将只加载指定的列。在这种情况下,我们将仅从_a加载
,从_b
加载
,如果您以后需要其他字段,这些字段将加载额外的查询


然而,如果
member\u函数中的逻辑很简单,最好使用注释:然后在数据库中处理注释,从而允许过滤。然而,这并不总是可能的:Python允许计算非常复杂的事情,从而产生一个巨大的等效SQL表达式。此外,大多数数据库不允许联系Web服务和文件系统,因此一些功能根本不可能在注释中翻译。

取决于您想做什么。。。如果您希望
get\u total
显示为字段,您可以将此方法设置为一个属性方法,他将被计算为字段,因此它不会在数据库中持久化

属性方法

@property
def get_total(self):
    return self.from_a + self.from_b

Revenue.objects.filter(from_a__gt = 10).values('from_a', 'from_b', 'get_total')

您可以像调用常规类方法一样调用它,因此当您获得模型实例时,可以调用它

revenues = Revenue.objects.filter(from_a__gt = 10).values('from_a', 'from_b')
for revenue in revenues:
    print(revenue.get_total)

# OR
[r.get_total for r in Revenue.objects.filter(from_a__gt = 10)] # Like Wilem Van said
静态方法

@property
def get_total(self):
    return self.from_a + self.from_b

Revenue.objects.filter(from_a__gt = 10).values('from_a', 'from_b', 'get_total')
将其作为静态方法使用(这种方法不是最适合您的需要,但很高兴知道),您将此方法与类绑定,因此您不需要一个对象实例来管理它,只需要类引用 类别收入(……):

叫它是这样的 总收入(5,10)


备注:奇怪,在django docs上没有一个很好的staticmethod引用

一般来说,拥有100列应该不是一个好主意,通常这意味着你的设计中有一些东西是糟糕的。是的,不完全是100,我有其他包含文本字段的列,它们包含大量文本。但是我想知道有没有一种方法可以获取我需要的列的数据,也可以调用函数返回到第一个示例,模型实例方法,即“get_total”如何在Queryset的.values()方法中工作?我意识到我在其中写了一些错误,所以现在更新了,该方法将作为类内的常规字段处理,因此不会持久化的字段将在实例化它时进行计算,因此您可以使用values()并定义要在查询集中显示的列,如(类attrA、attrB、@property attrC(return attrA+attrC)MyClass.objects.all()。值('attrA',attrB',attrC'))
    @staticmethod
    def get_total(valueA, valueB):
        return valueA + valueB