【问题标题】:Django complex filtering of related objectsDjango对相关对象的复杂过滤
【发布时间】:2011-04-21 16:42:16
【问题描述】:

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

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 完成上述查询? 我已经尝试在 google 中搜索,但我看到的是一些示例是否为 NULL,在我的示例中我需要与某个值进行比较。

提前谢谢你。

【问题讨论】:

    标签: sql django model foreign-keys


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • with F('TraffPerMonth') 它说:文件“”,第 28 行,在 NameError: name 'F' is not defined without - 它需要文字而不是 'TraffPerMonth '字符串。
    • 需要导入F:from django.db.models import F
    猜你喜欢
    • 2010-09-20
    • 2019-02-14
    • 2018-11-18
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多