Django: Как сравнить два набора запросов и получить разницу без включения PK - PullRequest
0 голосов
/ 19 июня 2020

Я не думаю, что слово difference правильное, потому что вы можете подумать difference(), но для меня имеет смысл то, чего я пытаюсь достичь. Прошу прощения, если это распространенная проблема, которая уже решена, но я не могу найти решение или не могу понять ее.

У меня есть два набора запросов одной и той же модели, а именно:

qs1 = ErrorLog.objects.get(report=original_report).defer('report') # 272 rows returned
qs2 = ErrorLog.objects.get(report=new_report).defer('report')      # 266 rows returned

Я хочу сравнить первую строку со второй и найти строки 6, которые не совпадают в первой qs1

Я пробовал difference() и intersection(), но я продолжайте заканчиваться теми же 272 строками или 0 строками. У меня такое ощущение, что он видит pk как уникальное значение, поэтому никогда не находит совпадающих строк. Я пробовал следующее:

# Get the 4 fields I want to compare and exclude
field_1 = [error.field_1 for error in qs2]
field_2 = [error.field_2 for error in qs2]
field_3 = [error.field_3 for error in qs2]
field_4 = [error.field_4 for error in qs2]

# Assuming this would work
qs3 = qs1.exclude(field_1__in=field_1, field_2__in=field_2, field_3__in=field_3, field_4__in=field_4)

# But ended up with 10 rows in qs3 since it doesn't loop thru the fields it just excludes it if found, which isn't ideal since some rows might be duplicate in qs1 so.

Затем я подумал, что, возможно, union() объединит эти два и исключит любые дубликаты между ними, тогда я мог бы просто использовать exclude(pk__in=qs3_union). Но я понял, что union() работает не так.

1 Ответ

0 голосов
/ 19 июня 2020
qs1 = ErrorLog.objects.filter(report=original_report) # 272 rows
qs2 = ErrorLog.objects.filter(report=new_report) # 266 rows

diff_qs = qs1.difference(qs2) # 6 rows
...