Как использовать поле связанного имени в объекте Q
Я создаю экран поиска, и одним из вариантов запроса является поиск по "строке". Поэтому я пытаюсь получить все экземпляры строки в первичной модели И все экземпляры той же строки в связанной модели - но мне нужны только те связанные экземпляры, которые существуют со строкой. Например - можно искать слово "Tiger" в поле названия программы, поле библиотеки, поле примечаний, а также в поле автора сегмента, поле названия, поле библиотеки и т.д...
Итак, что было сказано - вот модели.
class Program(models.Model):
air_date = models.DateField(default="0000/00/00")
air_time = models.TimeField(default="00:00:00")
service = models.CharField(max_length=10)
title = models.CharField(max_length=190)
library = models.CharField(max_length=190, blank=True)
remarks = models.TextField(null=True,blank=True)
class Segment(models.Model):
program = models.ForeignKey(Program,
on_delete=models.CASCADE,
related_name='segments',
)
title = models.CharField(max_length=190, blank=True)
author = models.CharField(max_length=64,null=True,blank=True)
voice = models.CharField(max_length=64,null=True,blank=True)
library = models.CharField(max_length=190)
summary = models.TextField()
Мой объект Q для Program выглядит следующим образом...
q_words = []
q_words = query.split()
query_prog_title_array = reduce(or_,[Q(title__icontains=w) for w in q_words])
query_prog_library_array = reduce(or_,[Q(library__icontains=w) for w in q_words])
query_prog_remarks_array = reduce(or_,[Q(remarks__icontains=w) for w in q_words])
program_results = Program.objects.filter( query_prog_title_array |
query_prog_library_array |
query_prog_remarks_array).order_by('id').distinct()
Мой объект Q для сегмента выглядит следующим образом...
q_words = []
q_words = query.split()
query_title_array = reduce(or_,[Q(title__icontains=w) for w in q_words])
query_author_array = reduce(or_,[Q(author__icontains=w) for w in q_words])
query_voice_array = reduce(or_,[Q(voice__icontains=w) for w in q_words])
query_library_array = reduce(or_,[Q(library__icontains=w) for w in q_words])
query_summary_array = reduce(or_,[Q(summary__icontains=w) for w in q_words])
segment_results = Segment.objects.filter( query_title_array |
query_author_array |
query_voice_array |
query_library_array |
query_summary_array).order_by('program','sequence_number').distinct()
Вопрос в реальности - модель программы фактически имеет информацию о сегменте в ней (через segments.all()), есть ли способ использовать это в объекте Q вместо объекта сегмента и в то время как я хочу вернуть объекты программы, которые имеют текст в нем, я хочу видеть ТОЛЬКО сегменты, которые имеют фактические текстовые соответствия в нем...
Раньше я делал это очень неэффективным способом, отправляя все совпадающие сегменты и список программ, которые совпали, а затем отображал программы, и если программа имела совпадающие сегменты, то отображал сегменты, но это означало, что шаблон должен был циклически просматривать каждую запись сегмента для каждой программы. Для нескольких программ это не страшно, но для 10000 программ это будет работать не очень хорошо, и в результате шаблон вылетит. Кроме того, это означает, что контекст включает несколько слоев, что делает пейджинг совершенно другой проблемой.
Я действительно просто хочу, чтобы контекстом были Программы, и любой Сегмент, который идет с информацией о программе, который также соответствовал...
Надеюсь, я объяснил все правильно, и спасибо, что прочитали.