我遇到了以下问题,基本上我是这样做的:
class Account(models.Model):
TraffPerMonth = models.IntegerField(default=0)
Tariff = models.ForeignKey('Tariff')
class Tariff(models.Model):
InetTraff = models.IntegerField(default='0')
这是选择:
for user in Account.objects.all():
t_traff = long(user.Tariff.InetTraff)
if u_traff >= t_traff:
#do something
pass
需要一些时间,在大多数情况下,我浪费处理器时间,通过不过度使用限制的用户进行查找。这是一个简单的SQL查询,可以满足我的需求:
select ba.TraffPerMonth from billing_account ba , billing_tariff bt where ba.TraffPerMonth > bt.InetTraff group by ba.id;
如何使用Django进行上述查询? 我已经尝试在谷歌搜索,但我看到的是如果某些东西是NULL的例子,在我的例子中我需要与某些值进行比较。
提前谢谢。
答案 0 :(得分:4)
我不理解您的SQL查询 - 您按account.TraffPerMonth进行分组,但选择单个值而不是聚合,这没有任何意义。加入也是不正确的。
但是,我假设您希望通过ForeignKey加入用户的关税,并选择使用超过其关税限额的用户。这很简单:
accounts = Account.objects.filter(Tariff__InetTraff__gte=F('TraffPerMonth'))
您需要在那里使用F()
对象,因为您正在比较查询的同一(已加入)行中的项目,而不是将查询中的项目与常量进行比较。
快速样式点:在Python中,您应该使用lower_case_with_underscore
样式作为模型字段等属性,并为模型和其他类保留InitialCaps
样式。