有沒有什么簡單的方法可以進行查詢,如果它的所有子對象(貿易腿)數量列的值都為零,則它只返回父對象(貿易)?例如,如果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
提交
取消