Django ORM和链式选择相关
如何使用Django ORM执行此查询 它是一个多连接,从一个表链接到另一个表 关于selectrelated()的Django文档给出了一个例子,其中三个表通过外键“链接”起来:Book->Author->City 说 b=Book.objects。选择与之相关的('author\u homely')。获取(id=4) p=b.author没有进入数据库 c=p.homightry#没有进入数据库 “不命中数据库”必须意味着selectquery连接三个表。 因此,查询生成的sql应该显示(我还没有检查) 我的模型基于对现有数据库的分析,带有定义良好的外键。 我将在下面介绍这些模型的摘录Django ORM和链式选择相关,django,django-models,django-orm,Django,Django Models,Django Orm,如何使用Django ORM执行此查询 它是一个多连接,从一个表链接到另一个表 关于selectrelated()的Django文档给出了一个例子,其中三个表通过外键“链接”起来:Book->Author->City 说 b=Book.objects。选择与之相关的('author\u homely')。获取(id=4) p=b.author没有进入数据库 c=p.homightry#没有进入数据库 “不命中数据库”必须意味着selectquery连接三个表。 因此,查询生成的sql应该显示(我
SELECT *
FROM SERVICE
INNER JOIN VISIT ON SERVICE.VisitRecordID = VISIT.VisitRecordID
INNER JOIN CMPATIENT ON VISIT.PatientNo = CM_PATIENT.PATIENT_ID
我能做的第一件事
q = Service.objects.select_related('visitrecordid',).all()
这使得sql类似于:
SELECT * FROM [SERVICE] LEFT OUTER JOIN [VISIT] ON ([SERVICE].[VisitRecordID] = [VISIT].[VisitRecordID])
所以我得到的是左外连接,而不是内连接,这是一个问题。
但最重要的是,我不知道为什么CmPatient不参与查询
模型(摘录)
您可以通过
\uu
(两个下划线)遍历关系。所以你想要的是:
Service.objects.select_related('visitrecordid__patientno')
你能分享你的django模型和你试图在这个查询中获取的数据(即列)吗?谢谢,我现在意识到我不知道如何阅读文档。附带问题,你是否与现有数据库集成?您的模型没有像我期望的那样定义“普通”django模型。特别是将_id作为id,使用db_列,并将外键定义为patientno和visitrecordid(我建议分别使用patient或cm_patient和visit)。没错,这些模型是通过在大型数据库上运行manage.py inspectdb创建的。它也做得很好。啊,好的。那就忽略我的建议吧。嗯,差不多。我仍然可能会重命名关系字段,以便在ORM方面更有意义。在这些情况下,请使用
prefetch\u related
。
Service.objects.select_related('visitrecordid__patientno')