Django Исключает объекты модели из запроса с помощью списка

#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))))