我有以下型号:
class TestCaseStatus(models.Model):
name = models.CharField(default='n/a', max_length=50)
def __str__(self):
return self.name
class TestCase(models.Model):
id = models.CharField(unique=True, max_length=100, primary_key=True)
name = models.CharField(default='n/a', max_length=200)
def __str__(self):
return self.name
class TestRun(models.Model):
test_id = models.ForeignKey(TestCase)
run_id = models.CharField(max_length=100, default='0')
datetime = models.DateTimeField()
status = models.ForeignKey(TestCaseStatus)
messages = models.CharField(default='n/a', max_length=500)
def __str__(self):
return self.run_id, self.test_id, self.status
我要执行以下SQL查询:
select a.test_id_id, a.status_id, b.status_id
from runscompare_testrun as a
left join runscompare_testrun as b on a.test_id_id = b.test_id_id
where a.run_id = 1 and b.run_id=2
SQL输出:
我认为有一种django的方法可以避免使用raw()调用,但是我似乎找不到它。
最佳答案
如果我正确理解了您的查询,则需要run_id="1"
的所有详细信息,以及TestCase
相同但run_id="2"
的所有运行的其他详细信息。
有了这个假设,您可以执行以下操作:
# Start with run_id=1
a = TestRun.objects.filter(run_id="1").select_related(
'test_id', 'status').prefetch_related(
'test_id__testrun_set', 'test_id__testrun_set__status')
# For each, get related
for i in a:
b = i.test_id.testrun_set.filter(run_id="2")
print(i.test_id, i.status, [j.status for j in b])
这不会是单个数据库查询,因为
select_related
(docs)和prefetch_related
(docs)都将进行数据库调用,但是会减少调用次数。
关于django - django左联接查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42183886/