使用模型字段查询django中的另一个模型字段

时间:2018-01-19 13:19:12

标签: python django orm

我的django应用程序中有两个模型

class Reg(models.Model):
   transactions = ManyToMany
   price = IntegerField

class Transaction(models.Model)
   amount = IntegerField

现在我想查找:

Registration.objects.filter(reg__price==transaction__amount)

以前我们使用以下方法:

  • 注册有一个属性is_paid,用于计算存在等额的交易
  • [r for registration.objects.filter(...)if r.is_paid]

这非常耗费查询并且效率低下。 我想知道是否有更好的方法来做到这一点! 任何提示都表示赞赏:)

1 个答案:

答案 0 :(得分:2)

您可以使用F expression进行此类查询:

from django.db.models import F

Registration.objects.filter(price=F('transactions__amount'))

这将过滤Registration等于price'之一的所有transactions个实例。 amount。如果您想要所有交易金额'总和等于或大于注册价格,您可以使用注释aggregate each registration's Sum

paid_registrations = Registration.objects.\
   annotate(ta=Sum('transactions__amount')).\  # annotate with ta sum
   filter(price__lte=F('ta'))  # filter those whose price is <= that sum