django - django左联接查询

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

我有以下型号:

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输出:

sql output

我认为有一种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_relateddocs)和prefetch_relateddocs)都将进行数据库调用,但是会减少调用次数。

关于django - django左联接查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42183886/

相关文章:

c++ - 编译自定义 c++ 包装器 sqlite3

python - 在 Python 中使用 CBC 初始化向量显示(二进制)

Python 递归,为什么我的函数不起作用?

python - 如何使用 Regex 指定长 url 模式,以便它们遵循 PEP8 准则

android - SQLite 执行查询并得到结果

python - django 在 View 函数中获取媒体 url

c# - 运算符 '!=' 不能应用于类型 'Task' 和 'int' 的操作数

python - 如何在不使用 @ 语法的情况下使用 "double layered"装饰器?

python - 限制wsgi中的系统资源

python - 如何修复 Meta.fields 不能是字符串。你是不是想输入 : ('name' )