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

有没有什么简单的方法可以进行查询,如果它的所有子对象(贸易腿)数量列的值都为零,则它只返回父对象(贸易)?


例如,如果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)


catspeake
浏览 221回答 3
3回答

九州编程

Trade如果任何相关TradeLeg对象的数量值为 0,您当前的查询会保留所有对象。使用exclude您可以排除Trade任何相关的TradeLeg数量值为 0 以外的所有对象:trade = Trade.objects.exclude(tradeleg__quantity__ne=0)正如 Amit 指出的,您当前的查询无效,因为tradeleg它不是Trade对象的属性。使用tradeleg_set__quantity__ne或设置related_nameForeignKey的属性。

aluckdog

我找到了最适合我的答案。我们可以使用 annotate 将虚拟列添加到我们的父对象。那么我们现在可以从中过滤。trades = Trade.objects.annotate(total_quantity=Sum('tradeleg__quantity')).filter(total_quantity__lte=0)

明月笑刀无情

嗨,第一件事是 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:&nbsp; &nbsp; return Noneelse:&nbsp; &nbsp; return trade
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python