django - Searchview от двух моделей с использованием цепочки - PullRequest
0 голосов
/ 22 января 2020

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

class SearchResultsView(ListView):
  template_name = 'searchresults.html'

    def get_queryset(self): # new
        query = self.request.GET.get('q')
        meta_list = Metadataform.objects.filter(
            Q(id__icontains=query) | Q(Authors_Name__icontains=query) | Q(Affliations__icontains=query) | Q(Methods__icontains=query) | Q(Instruments__icontains=query) | Q(Software__icontains=query)| Q(Models__icontains=query)| Q(Device__icontains=query)
        )

        dataset_list = uploadmeta.objects.filter(Q(datafile__icontains=query)
        )

        object_list = chain(meta_list, dataset_list)
        return object_list


<h1>Search Results</h1>

    <table class="table table-striped">
        <thead>
            <tr>
                <th>Meta ID</th>
                <th>Author</th>
                <th>Download</th>
            </tr>
        </thead>
        <tbody>
          {% if object_list %}

          {% for a in object_list %}


            <tr>
                <td>{{ a.Authors_Name }}</td>
                <td>  {{ a.datafile }} </td>
            </tr>

            {% endfor %}

          {% else %}
          {% endif %}
        </tbody>
    </table>

1 Ответ

0 голосов
/ 22 января 2020

Вы правильно используете функцию itertools.chain для объединения нескольких наборов запросов.

2 вещи, которые нужно попробовать:

  1. Проверьте результат dataset_list = uploadmeta.objects.filter(Q(datafile__icontains=query)), возможно, в результате этого запроса не найдено ни одного результата. Что означало бы, что никаких результатов не будет (проверьте данные).

  2. Попробуйте удалить атрибут класса model. Попробуйте удалить определение модели в SearchResultsView.

class SearchResultsView(ListView):
    template_name = 'searchresults.html'

    def get_queryset(self): # new
        query = self.request.GET.get('q')
        meta_list = Metadataform.objects.filter(
            Q(id__icontains=query) | Q(Authors_Name__icontains=query) | Q(Affliations__icontains=query) | Q(Methods__icontains=query) | Q(Instruments__icontains=query) | Q(Software__icontains=query)| Q(Models__icontains=query)| Q(Device__icontains=query)
        )

        dataset_list = uploadmeta.objects.filter(Q(datafile__icontains=query)
        )

        object_list = list(chain(meta_list, dataset_list))
        return object_list
...