2014-06-17 38 views
2

我試圖排除在另一個查詢集中具有外鍵的django查詢集中的所有對象。但是,我沒有成功使用exclude()。請幫忙。DJANGO:通過QuerySet的FK字段查找排除()

下面是從Python Shell中的一個片段:

>>> shipped = shipment_detail.objects.all() 
>>> shipped 
[<shipment_detail: 4>] 
>>> fo = fill_order.objects.exclude(product_order__in=shipped) 
>>> fo 
[<fill_order: 2>] 
>>> for x in shipped: 
... x.product_order.id 
... 
1 
>>> fo 
[<fill_order: 2>] 
>>> for x in fo: 
... x.product_order.id 
... 
1 

我使用Django 1.7,蟒蛇2.7.7和PostgreSQL 9.3,Debian的喘息。

UPDATE:實現我可以看到sql django正在使用。這裏是。顯然不是什麼即時通訊試圖實現。看起來我需要明確告訴django我的意思是引用FK id而不是記錄ID。

SELECT "box_inv_fill_order"."id", "box_inv_fill_order"."product_order_id", 
"box_ inv_fill_order" ."date" 
FROM "box_inv_fill_order" 
WHERE NOT ("box_inv_fill_order"."product_order_id" 
IN (SELECT "box_inv_shipment_detail"."id" FROM "box_inv_shipment_detail")) 
+1

'fill_order.objects.exclude(product_order_id__in = [r.id for r])'有什麼區別嗎?謝謝。 – alecxe

+0

Thx @alecxe!這與查看實際的sql結合起來,這是一個非常簡單和明確的修復。由於我在'運行'查詢集中引用了FK,因此我使用'r.product_order'來裝載''。謝謝! –

+1

不要忘記你可以使用'.values_list('id',flat = True)'來最小化資源並優化它。 – dt0xff

回答

2

fo = fill_order.objects.exclude(product_order__in=shipped)

產地:

SELECT "box_inv_fill_order"."id", "box_inv_fill_order"."product_order_id", 
"box_ inv_fill_order" ."date" 
FROM "box_inv_fill_order" 
WHERE NOT ("box_inv_fill_order"."product_order_id" 
IN (SELECT "box_inv_shipment_detail"."id" FROM "box_inv_shipment_detail")) 

與此相比product_order_idshipment_detail_id不是我打算什麼!

Utlizing的.filter(...__in=[r.product_order for r in shipped]) @alecxe建議,創建嵌套的SQL SELECT作爲IN參數。

SELECT "box_inv_fill_order"."id", "box_inv_fill_order"."product_order_id", "box_inv_fill_order"."date" 
FROM "box_inv_fill_order" 
WHERE NOT ("box_inv_fill_order"."product_order_id" 
IN (4)) 
相關問題