Gibt exakte Übereinstimmungen am Anfang von Django Queryset zurück

8

Ich habe ein Django-Modell namens "Benutzer", in dem einige grundlegende Informationen über Personen gespeichert sind, nämlich Vor- und Nachname. Ich habe derzeit eine einfache Suche in meinem Django-Modell. Wenn ein Benutzer einen ersten Namen eingibt, gibt das django-Queryset die ersten 10 Übereinstimmungen zurück, sortiert nach last Name.

Wenn Sie beispielsweise nach "Sam" suchen, erhalten Sie möglicherweise folgende Ergebnisse:

  1. Sam Abbott
  2. Samuel Baker
  3. Sammy Rogers
  4. Sam Simmons

Der Code dafür ist einfach:

%Vor%

Ich möchte dies jedoch so ändern, dass zuerst exakte Vornamentreffer zurückgegeben werden, gefolgt von den restlichen Ergebnissen. Wenn also jemand "Sam" eingibt, sollten die Ergebnisse stattdessen lauten:

  1. Sam Abbott
  2. Sam Simmons
  3. Samuel Baker
  4. Sammy Rogers

(Der exakte Vorname entspricht zuerst, sortiert nach dem Nachnamen, gefolgt von den restlichen Übereinstimmungen sortiert nach Nachnamen).

Ich habe darüber nachgedacht, dies in zwei Abfragesätze umzuwandeln und dann die Listen einfach zu kombinieren, aber ich habe mich gefragt, ob es möglich ist, dies in einer Abfrage zu tun, im Idealfall mit der Basis-API von django (anstatt eine einmalige Abfrage zu schreiben) ). Kennt jemand einen Weg, das zu tun?

Vielen Dank im Voraus.

    
Chad 10.07.2012, 05:03
quelle

5 Antworten

3

Ich denke nicht, dass es wirklich möglich ist, das mit nur einer Abfrage zu tun (zumindest mit Django ORM).

Ihre 2 Abfragen sollten also so aussehen:

%Vor%

Eine andere Möglichkeit ist es, die Abfrage in Python zu filtern, aber Sie müssen alle Ergebnisse erhalten, nicht nur die letzten 10:

%Vor%     
Etienne 10.07.2012, 17:52
quelle
3
%Vor%

werfen Sie auch einen Blick auf diese Frage, die nicht tiefer geht, als Sie wahrscheinlich brauchen: Wie kombiniere ich 2 oder mehr Abfragesätze in einer Django-Ansicht?

    
Francis Yaconiello 10.07.2012 18:02
quelle
3

Es ist nicht schön und persönlich würde ich empfehlen, eine Suchmaschine wie django-haystack zu verwenden, aber wenn Sie wissen, welche Datenbank Sie verwenden Sie könnten QuerySet.extra verwenden Fügen Sie ein Feld hinzu, um die Datensätze zu sortieren:

%Vor%     
Max Peterson 11.07.2012 19:25
quelle
1

Ich denke, Sie brauchen vielleicht eine Volltextsuche, um das zu erreichen. Schau dir djang-sphinx an.

Wenn Ihr Beispiel so kompliziert ist wie Ihr vollständiger Anwendungsfall, können Sie einfach die Sortierung und Sortierung in Ihrem Benutzercode vornehmen.

    
JeffS 10.07.2012 05:56
quelle
0

Sie können nach mehreren Attributen sortieren.

%Vor%

Sie ordnen also zuerst nach first zu, damit Ihre Objekte Filter nach exakter Übereinstimmung und nachfolgenden Übereinstimmungen erhalten. Und dann bestellst du wieder an last , um nach dem Nachnamen zu sortieren.

    
Rohan 10.07.2012 05:23
quelle