【问题标题】:DJANGO: FK field lookups through QuerySet exclude()DJANGO:通过 QuerySet exclude() 进行 FK 字段查找
【发布时间】: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


【解决方案1】:

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 进行比较。 不是我想要的!

解决方案

利用.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))

【讨论】:

    猜你喜欢
    • 2018-03-30
    • 2013-05-18
    • 2020-02-06
    • 2010-09-23
    • 2015-05-26
    • 1970-01-01
    • 1970-01-01
    • 2020-10-07
    相关资源
    最近更新 更多