Django复杂过滤相关对象

时间:2010-10-06 08:07:45

标签: sql django model foreign-keys

我遇到了以下问题,基本上我是这样做的:

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的例子,在我的例子中我需要与某些值进行比较。

提前谢谢。

1 个答案:

答案 0 :(得分:4)

我不理解您的SQL查询 - 您按account.TraffPerMonth进行分组,但选择单个值而不是聚合,这没有任何意义。加入也是不正确的。

但是,我假设您希望通过ForeignKey加入用户的关税,并选择使用超过其关税限额的用户。这很简单:

accounts = Account.objects.filter(Tariff__InetTraff__gte=F('TraffPerMonth'))

您需要在那里使用F()对象,因为您正在比较查询的同一(已加入)行中的项目,而不是将查询中的项目与常量进行比较。

快速样式点:在Python中,您应该使用lower_case_with_underscore样式作为模型字段等属性,并为模型和其他类保留InitialCaps样式。