【发布时间】:2017-10-12 18:55:03
【问题描述】:
我的模型结构如下所示:
class OneModel(model):
not_important = IntegerField()
class RelatedModel():
propertyA = IntegerField()
propertyB = IntegerField()
original = ForeignKey(OneModel, related_name='related')
我正在寻找一个原生 django 解决方案(没有原始 sql),基本上重新创建这个查询:
select * from OneModel om where not exists
(select id from RelatedModel rm where original_id = om.id and propertyA = 1 and propertyB = 2);
这是我尝试过的:
OneModel.objects.exclude(related__propertyA=1, related__propertyB=2)
不幸的是,这会选择OneModel 对象,这些对象既不与propertyA=1相关,也不与propertyB=2相关,而不是不相关的对象'没有与两个条件匹配的单个相关。
这是我的 django 查询生成的 sql:
SELECT lots_of_fields
FROM "OneModel"
WHERE NOT ("OneModel"."id" IN (SELECT U1."original_id" AS Col1
FROM "RelatedModel" U1
WHERE U1."PropertyA" = 1)
AND
"OneModel"."id" IN (SELECT U1."original_id" AS Col1
FROM "RelatedModel" U1
WHERE U1."PropertyB" = 2))
为了清楚起见,我的问题不在于使用 "id" in 而不是存在,而是在于查询的逻辑。
我尝试过使用 Q 对象,但想不出任何方法来解决这个问题。我还查看了 F 对象,但它们似乎也不相关。有什么方法可以在纯 django 中表达这一点,还是我有决心编写 SQL?
至于为什么不只使用 SQL,我承认这更多是因为自豪/想要学习新事物而不是其他任何东西。
【问题讨论】:
标签: sql django django-models orm