【问题标题】:django jeft join querydjango左连接查询
【发布时间】:2017-06-30 05:57:06
【问题描述】:

我有以下型号:

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() 调用,但我似乎找不到它。

【问题讨论】:

    标签: django sqlite python-3.x django-models


    【解决方案1】:

    如果我正确理解了您的查询,您需要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) 都会进行数据库调用,但会减少调用次数。

    【讨论】:

      猜你喜欢
      • 2018-08-17
      • 1970-01-01
      • 2011-09-23
      • 2021-12-25
      • 2017-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多