[PYTHON] [Django] Fehler bei Verwendung des Q-Objekts (Zugehöriges Feld hat ungültige Suche erhalten)

Einführung

Bei der Implementierung der Suchfunktion haben wir die Verwendung von Q-Objekten eingegrenzt. Hier wurde der Fehler "Zugehöriges Feld wurde ungültig gesucht" angezeigt. Notieren Sie daher die Ursache.

Status

Das Modell bereitet ein Post-Modell vor und hat das Poster, den Titel, den Inhalt und das Post-Datum als Felder.

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


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

Rufen Sie den Inhalt des Suchformulars mit "q_word = self.request.GET.get (" query ")" ab. Verwenden Sie das Q-Objekt, um die in index.html zu rendernde Objektliste einzugrenzen. Wenn es nicht existiert, gibt es einfach object_list zurück.

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

Ursache

Die Fehlerursache ist der Teil "Q (author__icontains = q_word)" von app / views.py. In der IndexView-Klasse von views.py werden Autor, Titel und Inhalt als Suchziele angegeben, im Post-Modell von models.py wird das Autorenfeld jedoch von ForeignKey () dem Benutzermodell zugeordnet. Daher muss das dem Autorenfeld zugeordnete Modellfeld angegeben werden. Mit anderen Worten Es ist erforderlich, es in "Q (author__username__icontains = q_word)" anstelle von "Q (author__icontains = q_word)" zu ändern und nach dem Benutzernamenfeld des Benutzermodells zu suchen, das dem Autorenfeld zugeordnet ist.

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) |    #Veränderung! !!
                Q(title__icontains=q_word) |
                Q(content__icontains=q_word)
            )
        else:
            object_list = Post.objects.all()
        return object_list

Recommended Posts

[Django] Fehler bei Verwendung des Q-Objekts (Zugehöriges Feld hat ungültige Suche erhalten)
Bei der Verwendung von Tensorboard mit Pytorch ist ein Fehler aufgetreten
Bei Verwendung von JUMAN ++ mit PyKNP ist ein Wertefehler aufgetreten
DEBUG-Einstellungen bei Verwendung von Django