【发布时间】:2014-08-07 21:17:18
【问题描述】:
我试图从 django 查询集中排除在另一个查询集中具有外键的所有对象。但是,我使用exclude() 没有成功。请帮忙。
这是来自 python shell 的 sn-p:
>>> 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
我在 debian wheezy 上使用 django 1.7、python 2.7.7、postgresql 9.3。
更新:意识到我可以看到 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"))
【问题讨论】:
-
fill_order.objects.exclude(product_order_id__in=[r.id for r in shipped])有什么不同吗?谢谢。 -
谢谢@alecxe !这与查看实际 sql 相结合,使其成为一个非常简单明了的修复程序。因为我在
shipped查询集中引用了一个FK,所以我使用r.product_order for r in shipped。谢谢! -
别忘了你可以使用
.values_list('id', flat=True)来最小化和优化资源。
标签: python django postgresql orm