3👍
Unless I’m missing something, you can use python to query your DB like so:
from django.contrib.auth.models import User
x = User.objects.filter(first_name='John', last_name='Smith')
Edit:
To answer your question:
If you need to return ‘John Paul Smith’ when the user searches for ‘John Smith’ then you can use ‘contains‘ which translates into a SQL LIKE. If you just need the capacity to store the name ‘John Paul’ put both names in the first_name column.
User.objects.filter(first_name__contains='John', last_name__contains='Smith')
This translates to:
SELECT * FROM USERS
WHERE first_name LIKE'%John%'
AND last_name LIKE'%Smith%'
64👍
This question was posted long time ago, but I had the similar problem and find answers here pretty bad. The accepted answer only allows you to find exact match by first_name and last_name. The second answer is a little bit better but still bad because you hit database as much as there was words.
Here’s my solution that concatenates first_name and last_name annotates it and search in this field:
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)
For example if the name of the person is John Smith, you can find him by typing john smith, john, smith, hn smi and so on. It hits database only ones. And I think this will be the exact SQL that you wanted in the open post.
- [Django]-Django: How do I add arbitrary html attributes to input fields on a form?
- [Django]-Readonly models in Django admin interface?
- [Django]-Manager isn't accessible via model instances
13👍
Easier:
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
Where query_name could be “John Smith” (but would also retrieve user Smith John if any).
- [Django]-Django Shell No module named settings
- [Django]-Multiple level template inheritance in Jinja2?
- [Django]-Django Facebook Connect App Recommendation
5👍
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 )
- [Django]-Troubleshooting Site Slowness on a Nginx + Gunicorn + Django Stack
- [Django]-Django filter queryset on "tuples" of values for multiple columns
- [Django]-Detect django testing mode
3👍
I used this Query to search firstname, lastname, also the fullname.
It solved my 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)
)
- [Django]-Django rest framework permission_classes of ViewSet method
- [Django]-How to delete cookies in Django?
- [Django]-Django: Where does "DoesNotExist" come from?
0👍
What about this:
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)
Tried and tested!
- [Django]-Get distinct values of Queryset by field
- [Django]-How to delete a record in Django models?
- [Django]-How can I resolve 'django_content_type already exists'?
0👍
I would use the Django method get_full_name()
on User
model. There is no need to create a column on the Database.
See here for more info: https://docs.djangoproject.com/en/4.1/ref/contrib/auth/#django.contrib.auth.models.User.get_full_name
Then you could do something like this in your templates:
{{ myUser.get_full_name|default:myUser.username }}
As first_name
and last_name
are not required on the User
model, it could return empty. Then this way you can have a default of username
if they are.
- [Django]-Django's SuspiciousOperation Invalid HTTP_HOST header
- [Django]-Django on IronPython
- [Django]-How do I retrieve a Django model class dynamically?