#django #django-models
Вопрос:
Возникли проблемы с моим запросом, исключающим результаты из другого запроса.
У меня есть сегмент таблицы, из которого я уже получил записи. Это связано с другой табличной программой, и я хочу также выполнить тот же запрос к ней, но я хочу исключить любую из программ, которые уже были найдены во время запроса сегмента.
Когда я пытаюсь это сделать, список не разрешается использовать при сравнении… Смотреть ниже:
query = "My Query String"
segment_results = Segment.objects.filter(
Q(title__icontains=query)|
Q(author__icontains=query)|
Q(voice__icontains=query)|
Q(library__icontains=query)|
Q(summary__icontains=query) ).distinct()
# There can be multiple segments in the same program
unique_programs = []
for segs in segment_results:
if segs.program.pk not in unique_programs:
unique_programs.append(segs.program.pk)
program_results = ( (Program.objects.filter(
Q(title__icontains=query) |
Q(library__icontains=query) |
Q(mc__icontains=query) |
Q(producer__icontains=query) |
Q(editor__icontains=query) |
Q(remarks__icontains=query) ).distinct()) amp;
(Program.objects.exclude(id__in=[unique_programs])))
Я могу бежать:
for x in unique_programs:
p = Program.objects.filter(id=x)
print("p = %s" % p)
И я получаю список программ…что работает
Просто не знаю, как включить этот тип логики в результаты
запросите…и в то же время исключите его. Я попытался исключить ключевое слово,
но главная проблема в том, что ему не нравится, что список находится в запросе — я получаю
ошибку:
TypeError: аргумент int() должен быть строкой, байтоподобным объектом или числом, а не «списком».
Чувствую, что я близок…
Ответ №1:
Ответ прост, я неправильно сравнивал объекты в фильтрах, поэтому правильным утверждением было бы:
program_results = (Program.objects.filter(
Q(title__icontains=query) |
Q(library__icontains=query) |
Q(mc__icontains=query) |
Q(producer__icontains=query) |
Q(editor__icontains=query) |
Q(remarks__icontains=query) )amp;
(Program.objects.exclude(id__in=Program.objects.filter(id__in=unique_programs))))