Dango - показывать название из нескольких моделей в строке автозаполнения поиска

Я хочу отображать названия двух моделей в автозаполнении в строке поиска, однако я не уверен, как написать цикл в функции search_address_qa, который бы отображал названия нескольких моделей.

На данный момент я могу правильно отобразить только address_objects (Статья) или address_objects_qa (QA), но не оба. Результаты от search_items в порядке. Когда я пытаюсь поставить for address_object in address_objects_qa or address_objects, то получаю случайные результаты.

models.py

class QA(models.Model):
    title=models.CharField(max_length=1000, help_text='max 1000 characters')
    body = RichTextField(verbose_name='Description', blank=True)

class Article(models.Model):
    title=models.CharField(max_length=1000, help_text='max 1000 characters')
     body = RichTextField(verbose_name='Description', blank=True)

views.py

@login_required
def search_address_qa(request):
    query = request.GET.get('title')
    payload = []
    if query:
        lookups = Q(title__icontains=query)
        address_objects = Article.objects.filter(lookups, status=1)
        address_objects_qa = QA.objects.filter(lookups, status=1)
        
        for address_object in address_objects_qa:
            payload.append(address_object.title)
    return JsonResponse({'status':200, 'data': payload})

@login_required
def search_items(request):
    query = request.GET.get('q')
    article = Article.objects.filter(title__icontains=query)
    qa_list = QA.objects.filter(title__icontains=query)
    
    if query is not None:
        lookups = Q(title__icontains=query) |Q(body__icontains=query) 
        article = Article.objects.filter(lookups).distinct()
        qa_list = QA.objects.filter(lookups).distinct()

    context = {
        'query_name': query,
        'search_items': article,
        'qa_list': qa_list,
    }
    return render(request, 'search/search_items.html', context)

search_items.html

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=yes" />
  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/css/bootstrap.min.css" rel="stylesheet" crossorigin="anonymous">
  <link rel="stylesheet" href="https://unpkg.com/@trevoreyre/autocomplete-js/dist/style.css" />

</head>

<body>

<main class="container-fluid">

  <!--HEADER-->
  <header class="header" id="header">
    <h3 class="col-6">Search results for: {{ query_name }}</h3>
    
    <!--SEARCH BAR-->
    <button class="col-6" onclick="openSearch()"><i class="fas fa-search fa-sm"></i></button>
    <form action="{% url 'search_items' %}" method="get" id="search">
      {% csrf_token %}
      <div class="searchbar" id="autocomplete">
        <input name="q" type="text" placeholder="Search..." class="search_input">
        <button class="search_icon"><i class="fas fa-search fa-sm"></i></button>
        <ul class="autocomplete-result-list"></ul>
      </div>
    </form>
    <!--END SEARCH BAR-->
  </header>
  <!--END HEADER-->

  {% if qa_list %}
  <section class="py-3">
    <h2>Q&A's</h2>
    <hr>
    <div class="row">
      {% for qa in qa_list %}
        <div class="col-10">
            <a href="{{ qa.get_absolute_url }}">{{qa.title}}</a>
        </div>
      {% endfor %}
    </div>
  </section>
  {% endif %}

  {% if search_items %}
  <section class="py-3">
    <h2>Q&A's</h2>
    <hr>
    <div class="row">
      {% for article in search_items %}
        <div class="col-10">
            <a href="{{ article.get_absolute_url }}">{{article.title}}</a>
        </div>
      {% endfor %}
    </div>
  </section>
  {% endif %}
</main>

<!--JS files-->
<script src="https://unpkg.com/@trevoreyre/autocomplete-js"></script>

Как было предложено в комментариях, я использовал itertools.chain для итерации по 2 моделям. Я размещаю код ниже. Возможно, он будет полезен для кого-то.

from itertools import chain

@login_required
def search_title(request):
    query = request.GET.get('title')
    payload = []
    if query:
        lookups = Q(title__icontains=query)
        optimazon_titles = Article.objects.filter(lookups, status=1)
        qa_titles = QA.objects.filter(lookups, status=1)
        
        payload = map(lambda x: x.title, chain(optimazon_titles, qa_titles))
            
    return JsonResponse({'status':200, 'data': list(payload)})
Вернуться на верх