首页 文章

Django查询,仅在所有子列的值为零时返回

提问于
浏览
0

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

例如如果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 回答

  • 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
    
  • 1

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

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

    由于Amit注意到您当前的查询无效,因为 tradeleg 不是 Trade 对象的属性 . 使用 tradeleg_set__quantity__ne 或设置ForeignKey的related_name属性 .

  • 0

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

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

相关问题