Jak mogę zapytać o pełną nazwę w Django?

Aby wyjaśnić, zasadniczo chcę utworzyć tymczasową kolumnę, łącząc pierwszą nazwę i nazwę ostatniej nazwy, aby dać pełny nazwę, a następnie w ten sposób:

select [fields] from Users where CONCAT(first_name, ' ', last_name) LIKE '%John Smith%";

Powyższe zapytanie zwrócą wszystkich użytkowników o imieniu John Smith. Jeśli to możliwe, chciałbym uniknąć używania surowego połączenia SQL.

Model, o którym mówię konkretnie, to model użytkownika Django.Contrib.auth.models. Wprowadzanie zmian w modelu bezpośrednio nie stanowi problemu.

Na przykład, jeśli użytkownik miał szukać "Jana Pawła Smitha", powinien być zgodny z użytkownikami z imieniem "Jana Pawła" i nazwiska "Smith", a także użytkownikami z imią "John" i nazwisko " Paul Smith'.

26
user719958 7 październik 2011, 03:42

6 odpowiedzi

Najlepsza odpowiedź

Chyba że czegoś brakowam, możesz użyć Pythona, aby zapytać swojego dB:

from django.contrib.auth.models import User
x = User.objects.filter(first_name='John', last_name='Smith') 

Edytuj: Odpowiedzieć na Twoje pytanie:

Jeśli musisz wrócić "John Paul Smith", kiedy użytkownik wyszukuje "John Smith", możesz użyć "zawiera", co przekłada się na jak np. Jeśli potrzebujesz po prostu pojemności do przechowywania nazwy "John Paul" umieścić obie nazwy w kolumnie pierwszej nazwy.

User.objects.filter(first_name__contains='John', last_name__contains='Smith') 

Przekłada się to na:

SELECT * FROM USERS
WHERE first_name LIKE'%John%' 
AND last_name LIKE'%Smith%'
3
garnertb 7 październik 2011, 18:35

To pytanie zostało opublikowane dawno temu, ale miałem podobny problem i znaleźć odpowiedzi tutaj bardzo źle. Akceptowana odpowiedź pozwala znaleźć dokładne dopasowanie według pierwszej nazwy i nazwy ostatniej. Druga odpowiedź jest trochę lepsza, ale wciąż źle, ponieważ trafisz tak bardzo, jak były słowa. Oto moje rozwiązanie, które Concaterenates First_name i Last_name Adnotuje go i szukaj w tej dziedzinie:

from django.db.models import Value as V
from django.db.models.functions import Concat   

users = User.objects.annotate(full_name=Concat('first_name', V(' '), 'last_name')).\
                filter(full_name__icontains=query)

Na przykład, jeśli nazwa osoby jest John Smith, możesz go znaleźć, wpisując John Smith, John, Smith, HN SMI i tak dalej. Uderza tylko te tylko. I myślę, że będzie to dokładny SQL, który chcesz w otwartym stanowisku.

42
svalemento 30 maj 2018, 14:27

Łatwiej:

from django.db.models import Q 

def find_user_by_name(query_name):
   qs = User.objects.all()
   for term in query_name.split():
     qs = qs.filter( Q(first_name__icontains = term) | Q(last_name__icontains = term))
   return qs

Gdzie kwerend_name może być "John Smith" (ale także odzyskałby użytkownika Smith Johna, jeśli istnieje).

11
rich tier 11 październik 2013, 23:52
class User( models.Model ):
    first_name = models.CharField( max_length=64 )
    last_name = models.CharField( max_length=64 )
    full_name = models.CharField( max_length=128 )
    def save( self, *args, **kw ):
        self.full_name = '{0} {1}'.format( first_name, last_name )
        super( User, self ).save( *args, **kw )
4
S.Lott 7 październik 2011, 09:56

A co z tym:

query = request.GET.get('query')
users = []

try:
    firstname = query.split(' ')[0]
    lastname  = query.split(' ')[1]
    users += Users.objects.filter(firstname__icontains=firstname,lastname__icontains=lastname)
    users += Users.objects.filter(firstname__icontains=lastname,lastname__icontains=firstname)

users = set(users)

Wypróbowany i przetestowany!

0
atx 26 maj 2017, 18:35

Użyłem tego zapytania, aby wyszukać Imię Imię, LastName, również FullName.

Rozwiązał mój problem.

from django.db.models import Q, F
from django.db.models import Value as V
from django.db.models.functions import Concat 

user_list = models.User.objects.annotate(
                        full_name=Concat('first_name', V(' '), 'last_name')
                    ).filter(   
                        Q(full_name__icontains=keyword) | 
                        Q(first_name__icontains=keyword) | 
                        Q(last_name__icontains=keyword)
                    )
0
Chandan Sharma 11 listopad 2019, 07:37