[PYTHON] [Django] Erreur lors de l'utilisation de l'objet Q (le champ associé a obtenu une recherche non valide)

introduction

Lors de l'implémentation de la fonction de recherche, nous avons réduit l'utilisation des objets Q. Ici, l'erreur «Le champ associé a obtenu une recherche non valide» est apparue, alors enregistrez la cause.

Statut

Le modèle prépare un modèle de publication et contient l'affiche, le titre, le contenu et la date de publication comme champs.

app/models.py


class Post(models.Model):
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    title = models.CharField(max_length=100)
    content = models.TextField()
    published_at = models.DateTimeField(auto_now_add=True)

app/urls.py


app_name = 'app'
urlpatterns = [
    path('', views.IndexView.as_view(), name='index'),
]

app/index.html


    <!--Formulaire de recherche-->
    <div>
        <form action="" method="get">
            <a type="submit"></a>
            <input name="query" value="{{ request.GET.query }}" type="search" placeholder="Search...">
        </form>
    </div>
    <!--Formulaire de recherche-->

Obtenez le contenu du formulaire de recherche avec q_word = self.request.GET.get ('query'), et s'il existe, utilisez l'objet Q pour affiner la liste d'objets à rendre dans index.html. S'il n'existe pas, il renvoie simplement object_list.

app/views


class IndexView(generic.ListView):
    model = Post
    template_name = 'app/index.html'

    def get_queryset(self):
        q_word = self.request.GET.get('query')

        if q_word:
            object_list = Post.objects.filter(
                Q(author__icontains=q_word) |
                Q(title__icontains=q_word) |
                Q(content__icontains=q_word)
            )
        else:
            object_list = Post.objects.all()
        return object_list

Cause

La cause de l'erreur est la partie Q (author__icontains = q_word) de app / views.py. Dans la classe IndexView de views.py, l'auteur, le titre et le contenu sont spécifiés comme cibles de recherche, mais dans le modèle Post de models.py, le champ auteur est associé au modèle utilisateur par ForeignKey (). Par conséquent, il est nécessaire de spécifier le champ modèle associé au champ auteur. En d'autres termes Il est nécessaire de le changer en Q (author__username__icontains = q_word) au lieu de Q (author__icontains = q_word) et de rechercher le champ username du modèle User associé au champ author.

app/views


class IndexView(generic.ListView):
    model = Post
    template_name = 'app/index.html'

    def get_queryset(self):
        q_word = self.request.GET.get('query')

        if q_word:
            object_list = Post.objects.filter(
                Q(author__username__icontains=q_word) |    #Changement! !!
                Q(title__icontains=q_word) |
                Q(content__icontains=q_word)
            )
        else:
            object_list = Post.objects.all()
        return object_list

Recommended Posts

[Django] Erreur lors de l'utilisation de l'objet Q (le champ associé a obtenu une recherche non valide)
J'ai eu une erreur lors de l'utilisation de Tensorboard avec Pytorch
J'ai eu une erreur de valeur lors de l'utilisation de JUMAN ++ avec PyKNP
Paramètres de DEBUG lors de l'utilisation de Django