使用 Django ORM 值并调用成员函数
Use Django ORM values and call member functions
我的 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).values('from_a', 'from_b')
检索数据。
我正在从上面的查询集中获取值,现在我想对对象调用 get_total
函数。
我没有找到调用该函数的方法。
有没有办法使用 values
检索我需要的数据并且还可以调用该对象的 member_functions
?
如果我的模型有 100 列,Revenue.objects.filter(from_a__gt = 10)
不应该是解决方案。
您可以在查询中使用 F expression
而不是在模型级别执行此操作:
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')
From the above queryset I am getting values, now I want to call get_total
function on objects. I didn't found a way to call that function.
好吧,您获得了一个 QuerySet
(此时尚未评估),因此 集合 Revenue
。您不能直接调用该集合上的函数。但是您可以通过查询集迭代,并在各个对象上调用该函数。例如,我们可以制作一个列表:
[<b>r.get_total()</b> for r in Revenue.objects.filter(from_a__gt = 10)]
Is there a way to retrieve the data only I needed using values and also can call member_functions
of that objects?
是的,您可以在查询中使用 .only(..)
元素来限制加载的列数:
[r.get_total() for r in Revenue.objects.filter(from_a__gt = 10)<b>.only('from_a', 'from_b')</b>]
这将构建 Revenue
个对象,但我们只会加载指定的列。在那种情况下,我们将只加载 from_a
和 from_b
,如果您稍后需要 other 字段,这些将加载 extra 查询。
但如果 member_function
中的逻辑很简单,您最好使用 注释 :然后在数据库中处理这些注释,从而允许过滤。然而,这并不总是可能的:Python 允许计算非常复杂的东西,这些东西会导致巨大的等效 SQL 表达式。此外,大多数数据库不允许联系网络服务和文件系统,因此某些功能根本不可能在注释中翻译。
取决于你想做什么...如果你想get_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')
https://docs.djangoproject.com/en/2.0/topics/db/models/#model-methods
您可以像常规 class 方法一样调用它,因此当您获得模型实例时,您可以调用它
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
静态方法
将其作为静态方法使用(这种方式不是最适合您的需要,但很高兴知道),您会将此方法与 class 绑定,因此您不需要一个对象实例来管理它, 只是 class 参考
class 收入(...):
...
@staticmethod
def get_total(valueA, valueB):
return valueA + valueB
这么叫
Revenue.get_total(5, 10)
https://www.programiz.com/python-programming/methods/built-in/staticmethod
Obs.:很奇怪,在 django 文档中没有对 staticmethod 有很好的参考
我的 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).values('from_a', 'from_b')
检索数据。
我正在从上面的查询集中获取值,现在我想对对象调用 get_total
函数。
我没有找到调用该函数的方法。
有没有办法使用 values
检索我需要的数据并且还可以调用该对象的 member_functions
?
Revenue.objects.filter(from_a__gt = 10)
不应该是解决方案。
您可以在查询中使用 F expression
而不是在模型级别执行此操作:
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')
From the above queryset I am getting values, now I want to call
get_total
function on objects. I didn't found a way to call that function.
好吧,您获得了一个 QuerySet
(此时尚未评估),因此 集合 Revenue
。您不能直接调用该集合上的函数。但是您可以通过查询集迭代,并在各个对象上调用该函数。例如,我们可以制作一个列表:
[<b>r.get_total()</b> for r in Revenue.objects.filter(from_a__gt = 10)]
Is there a way to retrieve the data only I needed using values and also can call
member_functions
of that objects?
是的,您可以在查询中使用 .only(..)
元素来限制加载的列数:
[r.get_total() for r in Revenue.objects.filter(from_a__gt = 10)<b>.only('from_a', 'from_b')</b>]
这将构建 Revenue
个对象,但我们只会加载指定的列。在那种情况下,我们将只加载 from_a
和 from_b
,如果您稍后需要 other 字段,这些将加载 extra 查询。
但如果 member_function
中的逻辑很简单,您最好使用 注释 :然后在数据库中处理这些注释,从而允许过滤。然而,这并不总是可能的:Python 允许计算非常复杂的东西,这些东西会导致巨大的等效 SQL 表达式。此外,大多数数据库不允许联系网络服务和文件系统,因此某些功能根本不可能在注释中翻译。
取决于你想做什么...如果你想get_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')
https://docs.djangoproject.com/en/2.0/topics/db/models/#model-methods
您可以像常规 class 方法一样调用它,因此当您获得模型实例时,您可以调用它
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
静态方法
将其作为静态方法使用(这种方式不是最适合您的需要,但很高兴知道),您会将此方法与 class 绑定,因此您不需要一个对象实例来管理它, 只是 class 参考 class 收入(...): ...
@staticmethod
def get_total(valueA, valueB):
return valueA + valueB
这么叫 Revenue.get_total(5, 10)
https://www.programiz.com/python-programming/methods/built-in/staticmethod
Obs.:很奇怪,在 django 文档中没有对 staticmethod 有很好的参考