0

是否有任何简单的方法来进行查询,如果它的所有子对象(tradeleg)数量列的值都为零,它只返回父对象(trade)?

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

3 回答 3

2

Trade如果任何相关TradeLeg对象的数量值为 0 ,则当前查询保留所有对象。使用exclude您可以排除Trade任何相关对象的数量值不为 0 的所有对象TradeLeg

trade = Trade.objects.exclude(tradeleg__quantity__ne=0)

正如 Amit 指出的那样,您当前的查询无效,因为tradeleg它不是Trade对象的属性。使用tradeleg_set__quantity__ne或设置related_nameForeignKey 的属性。

于 2018-12-10T09:44:53.347 回答
0

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

trades = Trade.objects.annotate(total_quantity=Sum('tradeleg__quantity')).filter(total_quantity__lte=0)
于 2018-12-10T10:00:25.057 回答
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:
    return None
else:
    return trade
于 2018-12-10T09:41:13.177 回答