J'essaie de construire la recherche pour un site Django que je suis en train de construire, et dans cette recherche, je cherche dans trois modèles différents. Et pour obtenir la pagination sur la liste des résultats de la recherche, je voudrais utiliser une vue générique object_list pour afficher les résultats. Mais pour ce faire, je dois fusionner trois ensembles de requêtes en un seul.
Comment puis-je faire ça ? J'ai essayé ceci :
result_list = []
page_list = Page.objects.filter(
Q(title__icontains=cleaned_search_term) |
Q(body__icontains=cleaned_search_term))
article_list = Article.objects.filter(
Q(title__icontains=cleaned_search_term) |
Q(body__icontains=cleaned_search_term) |
Q(tags__icontains=cleaned_search_term))
post_list = Post.objects.filter(
Q(title__icontains=cleaned_search_term) |
Q(body__icontains=cleaned_search_term) |
Q(tags__icontains=cleaned_search_term))
for x in page_list:
result_list.append(x)
for x in article_list:
result_list.append(x)
for x in post_list:
result_list.append(x)
return object_list(
request,
queryset=result_list,
template_object_name='result',
paginate_by=10,
extra_context={
'search_term': search_term},
template_name="search/result_list.html")
Mais cela ne fonctionne pas. J'obtiens une erreur lorsque j'essaie d'utiliser cette liste dans la vue générique. Il manque l'attribut clone à la liste.
Comment puis-je fusionner les trois listes, page_list
, article_list
y post_list
?
1 votes
Il semble que t_rybik ait créé une solution complète à l'adresse suivante djangosnippets.org/snippets/1933
1 votes
Pour la recherche, il est préférable d'utiliser des solutions dédiées telles que Haystack - il est très flexible.
1 votes
Utilisateurs de Django 1.11 et abv, voyez cette réponse - stackoverflow.com/a/42186970/6003362
0 votes
note La question se limite au cas très rare où, après avoir fusionné 3 modèles différents, il n'est pas nécessaire d'extraire à nouveau les modèles sur la liste pour distinguer les données sur les types. Dans la plupart des cas, si la distinction est attendue, l'interface sera erronée. Pour les mêmes modèles : voir les réponses sur
union
.