Python DJANGO:FK字段通过QuerySet exclude()查找

Python DJANGO:FK字段通过QuerySet exclude()查找,python,django,postgresql,orm,Python,Django,Postgresql,Orm,我试图从django查询集中排除在另一个查询集中有外键的所有对象。但是,我使用exclude()没有成功。请帮忙 以下是python shell的一个片段: >>> shipped = shipment_detail.objects.all() >>> shipped [<shipment_detail: 4>] >>> fo = fill_order.objects.exclude(product_order__in=shipp

我试图从django查询集中排除在另一个查询集中有外键的所有对象。但是,我使用
exclude()
没有成功。请帮忙

以下是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

fo=fill\u order.objects.exclude(产品\u order\u 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"))
这将
产品\u订单\u id
装运详细信息\u id
进行比较不是我想要的

解决方案

UTizing@alecxe建议的
.filter(…\uu in=[r.product\u r in shipped])
,创建一个嵌套的sql
SELECT
作为
中的
参数

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))

fill\u order.objects.exclude(产品\u order\u id\u in=[r.id for r in shipped])
有什么区别吗?谢谢。Thx@alecxe!这与查看实际sql相结合,使得这是一个非常简单和清晰的修复。因为我在
shipped
queryset中引用了一个FK,所以我在shipped
中为r使用
r.product\u订单。谢谢!不要忘记,您可以使用
.values\u list('id',flat=True)
来最小化资源并优化它。
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))