Django startswith, die auf den Feldern
sagen wir mal so, ich habe eine Adresse Modell mit einer PLZ-Gebiet. Ich kann lookup-Adressen mit PLZ beginnend mit "123" mit der Zeile:
Address.objects.filter(postcode__startswith="123")
Nun, ich brauche, um dies zu tun suchen, der "anders herum". Ich habe eine Adresse Modell mit einem postcode_prefix Feld, und ich brauche zum abrufen der Adressen, für die postcode_prefix ist ein Präfix mit einem bestimmten code, wie "12345". Also, wenn in meiner db hatte ich 2 Adressen mit postcode_prefix = "123" und "234", nur die erste würde zurückgegeben werden.
Etwas wie:
Address.objects.filter("12345".startswith(postcode_prefix))
Das problem ist, dass dies nicht funktioniert.
Die einzige Lösung, die ich mit oben kommen kann ist, führen Sie einen filter auf den ersten char, wie:
Address.objects.filter(postcode_prefix__startswith="12345"[0])
dann, wenn ich die Ergebnisse zu erhalten, machen Sie eine Liste Verständnis, dass die Filter richtig so:
results = [r for r in results if "12345".startswith(r.postcode_prefix)]
Gibt es einen besseren Weg, es zu tun in django?
danke,
Fabrizio
InformationsquelleAutor der Frage sfabriz | 2012-08-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
In SQL auszudrücken, was Sie erreichen wollen, liest sich wie ('12345' ist die Postleitzahl, den Sie suchen):
Dies ist nicht wirklich eine standard-Abfrage-und ich sehe keine Möglichkeit, dies zu erreichen in Django mit nur get()/filter().
Jedoch, Django bietet eine Möglichkeit, um zusätzliche SQL-Klauseln mit
extra()
:Finden Sie die Django-Dokumentation auf extra() für weitere Referenz. Beachten Sie auch, dass die extra enthält reines SQL, so dass Sie brauchen, um sicherzustellen, dass die Klausel gültig ist für Ihre Datenbank.
Hoffe, das funktioniert für Sie.
InformationsquelleAutor der Antwort cyroxx
Ich denke, was Sie versuchen zu tun, "so etwas wie" line ist richtig geschrieben:
InformationsquelleAutor der Antwort Joe Day
A., Wenn das Problem nicht https://code.djangoproject.com/ticket/13363
Sie könnten dies tun:
Vielleicht, werden Sie ein Problem beheben und es kann funktionieren.
B. Wenn das Problem nicht 16731 (sorry, nicht die vollständige url, nicht genug rep, finden Sie ein weiteres ticket oben) könnte man filtern von Feldern, die Hinzugefügt, mit '.kommentieren', mit Erstellung von benutzerdefinierten aggreation-Funktion, wie hier:
http://coder.cl/2011/09/custom-aggregates-on-django/
C. Letzte und erfolgreiche. Ich habe es geschafft, dies zu tun mit monkeypatching der folgenden:
Nur benutzerdefinierte lookup - '_beginnt', die umgekehrte Logik von '_startswith'
InformationsquelleAutor der Antwort brawaga
Eine mögliche alternative. (Habe keine Ahnung wie es im Vergleich zu den akzeptierten Lösung mit einer Spalte als zweiten Parameter auf wie in der Ausführungszeit)
q=reduce(lambda a,b:a|b, [Q(postcode__startswith=postcode[:i+1]) for i in range(len(postcode))])
Damit generieren Sie alle Präfixe, und oder Sie zusammen...
InformationsquelleAutor der Antwort Vajk Hermecz
Bisschen eine Menge, aber Sie können dies tun, indem Sie Anmerkungen zu Ihrer Suche nach Wert und dann filtern gegen Sie. Alles passiert ziemlich schnell-Datenbank.
Ich bin sicher, man könnte dies über eine schöne vorgefertigte Funktion in diesen Tagen auch... Aber das ist sauber genug für mich.
InformationsquelleAutor der Antwort Oli