有没有什么简单的方法可以进行查询,如果它的所有子对象(贸易腿)数量列的值都为零,则它只返回父对象(贸易)?例如,如果trade_1 有五个子项并且其所有子项的数量字段的值为“0”,则返回trade_1。例如,如果trade_2 有两个子项并且其中一个子项在其数量字段上的值为“1”,则不要返回trade_2。我有这个模型:class Trade: name = models.CharField( default='', max_length=50, blank=True, null=True ) date = models.DateField( default=None, blank=True, null=True )class TradeLeg(models.Model): trade = models.ForeignKey( Trade, on_delete=models.CASCADE ) quantity = models.IntegerField( default=0 )我目前的查询:trade = Trade.objects.filter(tradeleg__quantity = 0)
3 回答
九州编程
TA贡献1785条经验 获得超4个赞
Trade
如果任何相关TradeLeg
对象的数量值为 0,您当前的查询会保留所有对象。使用exclude
您可以排除Trade
任何相关的TradeLeg
数量值为 0 以外的所有对象:
trade = Trade.objects.exclude(tradeleg__quantity__ne=0)
正如 Amit 指出的,您当前的查询无效,因为tradeleg
它不是Trade
对象的属性。使用tradeleg_set__quantity__ne
或设置related_name
ForeignKey的属性。
aluckdog
TA贡献1847条经验 获得超7个赞
我找到了最适合我的答案。我们可以使用 annotate 将虚拟列添加到我们的父对象。那么我们现在可以从中过滤。
trades = Trade.objects.annotate(total_quantity=Sum('tradeleg__quantity')).filter(total_quantity__lte=0)
明月笑刀无情
TA贡献1828条经验 获得超4个赞
嗨,第一件事是 Trade 没有任何 TradeLed 参考,因此查询trade = Trade.objects.filter(tradeleg__quantity = 0)无效。
对于您想要的输出,您可以首先通过一些标准搜索交易,例如
trade = Trade.objects.filter(name = <some name>)
并使用此贸易对象过滤 TradeLeg 对象,例如
tradeleg = TradeLeg.objects.filter(trade = trade, quantity != 0)
if tradeleg:
return None
else:
return trade
添加回答
举报
0/150
提交
取消