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