如何使用 Django ORM 执行此查询?
它是一个多重联接,从一个表链接到另一个表。
关于 select 相关的 Django 文档 (https://docs.djangoproject.com/en/2.2/ref/models/querysets/#select-相关 https://docs.djangoproject.com/en/2.2/ref/models/querysets/#select-related)给出了一个示例,其中三个表通过外键“链接”:Book -> Author -> City。
saying
b = Book.objects.select_lated('author__hometown').get(id=4)
p = b.author # 不访问数据库。
c = p.hometown # 不访问数据库。
“未命中数据库”必须意味着选择查询连接三个表。
因此,查询生成的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 不参与查询。
模型(摘录)
class Service(models.Model):
servrecid = models.AutoField(db_column='ServRecID', primary_key=True) # Field name made lowercase.
visitrecordid = models.ForeignKey('Visit', models.DO_NOTHING, db_column='VisitRecordID', blank=True,
null=True) # Field name made lowercase.
itemno = models.CharField(db_column='ItemNo', max_length=10, blank=True, null=True) # Field name made lowercase.
class Visit(models.Model):
visitrecordid = models.AutoField(db_column='VisitRecordID', primary_key=True) # Field name made lowercase.
patientno = models.ForeignKey(CmPatient, models.DO_NOTHING, db_column='PatientNo', blank=True,
null=True) # Field name made lowercase.
visitdate = models.DateTimeField(db_column='VisitDate', blank=True, null=True) # Field name made lowercase.
servdoctor = models.CharField(db_column='ServDoctor', max_length=6, blank=True,
null=True) # Field name made lowercase.
class CmPatient(models.Model):
patient_id = models.AutoField(db_column='PATIENT_ID', primary_key=True) # Field name made lowercase.
ur_no = models.CharField(db_column='UR_NO', max_length=9, blank=True, null=True) # Field name made lowercase.
external_id = models.CharField(db_column='EXTERNAL_ID', max_length=9, blank=True,
null=True) # Field name made lowercase.
payer = models.ForeignKey('self', models.DO_NOTHING, db_column='PAYER_ID', blank=True,
null=True) # Field name made lowercase.