为了账号安全,请及时绑定邮箱和手机立即绑定

Django 查询,仅当所有子列值为零时才返回

Django 查询,仅当所有子列值为零时才返回

catspeake 2021-09-11 20:38:52
有没有什么简单的方法可以进行查询,如果它的所有子对象(贸易腿)数量列的值都为零,则它只返回父对象(贸易)?例如,如果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_nameForeignKey的属性。


查看完整回答
反对 回复 2021-09-11
?
aluckdog

TA贡献1847条经验 获得超7个赞

我找到了最适合我的答案。我们可以使用 annotate 将虚拟列添加到我们的父对象。那么我们现在可以从中过滤。

trades = Trade.objects.annotate(total_quantity=Sum('tradeleg__quantity')).filter(total_quantity__lte=0)



查看完整回答
反对 回复 2021-09-11
?
明月笑刀无情

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


查看完整回答
反对 回复 2021-09-11
  • 3 回答
  • 0 关注
  • 220 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信