Python DJANGO:FK字段通过QuerySet exclude()查找
我试图从django查询集中排除在另一个查询集中有外键的所有对象。但是,我使用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
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])
,创建一个嵌套的sqlSELECT
作为中的参数
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))