Django, используйте подзапросы вместо фильтрации по QuerySet, преобразованному в список

У меня есть две связанные модели:

class Execution(models.Model):
    name = models.CharField("Test Suite Name", max_length=1024)
    <...>

class TestCase(models.Model):
    name = models.CharField("Test Case Name", max_length=1024)
    result = models.CharField("Test Case Result", max_length=32)
    execution = models.ForeignKey(Execution, on_delete=models.CASCADE)
    <...>

Мне нужно сравнить два выполнения, составив список тестовых примеров, в которых есть расхождения в результатах.

Мой подход кажется достаточно питоническим и работает достаточно быстро, но я уверен, что это можно улучшить с помощью подзапросов Django (или, возможно, Exists()?)

Вот код, который у меня есть:

execution1 = Execution.objects.get(id=id1)  # Executions retrieval (irrelevant to the question)
execution2 = Execution.objects.get(id=id2)

execution1_testcases = execution1.testcase_set.all()
execution1_testcases_names = [testcase.name for testcase in execution1_testcases]

for testcase2 in execution2.testcase_set.order_by('-result', 'name'):
    if testcase2.name in execution1_testcases_names:
        # TODO: this most likely can be improved with Subqueries
        result1 = list(filter(lambda testcase1: testcase1.name == testcase2.name, execution1_testcases))[0].result
    else:
        result1 = None

    if result1 != testcase2.result:
        <...>  # discrepancy processing

0 ответов

Другие вопросы по тегам