2012-01-25 38 views
6

tôi có một ứng dụng django để truy xuất tất cả các đối tượng từ một bảng người dùng. tôi cũng đã thực hiện một hình thức tìm kiếm đầu vào, này là truy vấn thực hiện:truy vấn django - tìm kiếm firstname và lastname

all_soggs =  Entity.objects.filter(lastname__istartswith=request.GET['query_term']).order_by('lastname') 
if(all_soggs.count()==0): 
    all_soggs = Entity.objects.filter(firstname__istartswith=request.GET['query_term']).order_by('firstname') 

như bạn có thể nhìn thấy truy vấn đầu tiên tìm kiếm phù hợp với các mục bằng cách lastname, và sau đó bởi firstname. điều này làm việc cho đến khi tôi chèn tên đầy đủ 'firstaname lastname' hoặc 'lastname firstname', trong trường hợp này không có kết quả. làm thế nào tôi có thể sửa đổi các truy vấn để thực hiện tìm kiếm tốt hơn?

cảm ơn - luke

Trả lời

8

Sao chép/dán từ: https://stackoverflow.com/a/17361729/1297812

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 
+1

đã được giải quyết (hơn 1 năm trước). thanks anyway :-) – Luke

7

You need Q objects và bạn cũng cần phải chia truy vấn của bạn vào điều khoản riêng biệt (vì không có tên đầu tiên sẽ phù hợp với chuỗi đầy đủ "FirstName LastName").

Đây là ý tưởng phù hợp với bất kỳ tên hoặc họ bắt đầu bằng "Firstname" hoặc "LastName" trong tìm kiếm "Firstname Lastname".

Đây là tìm kiếm chung - điều chỉnh truy vấn cho phù hợp với nhu cầu cụ thể của bạn!

Chỉnh sửa: oops, tôi thực sự không thích sử dụng giảm vì có vẻ khó hiểu, nhưng chúng cần phải được ORED cùng nhau và chúng tôi không thể làm phiên bản chi tiết hơn vì số lượng cụm từ không xác định.

import operator 
from django.db.models import Q 

search_args = [] 
for term in request.GET['query_term'].split(): 
    for query in ('first_name__istartswith', 'last_name__istartswith'): 
     search_args.append(Q(**{query: term})) 

all_soggs = Entity.objects.filter(reduce(operator.or_, search_args)) 

Để làm rõ làm thế nào để sử dụng đối tượng Q, cho việc tìm kiếm "FirstName LastName" truy vấn trước đó bằng:

Entity.objects.filter(
    Q(first_name__istartswith="Firstname") | Q(last_name__istartswith="Firstname") | 
    Q(first_name__istartswith="Lastname") | Q(last_name__istartswith="Lastname") 
    ) 
0

tương tự câu hỏi: Querying full name in Django

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

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

entities = set(entities) 
+0

Điểm trả lời câu hỏi hai lần và tham khảo câu trả lời của riêng bạn là gì? –

+0

Theo các quy tắc của ngăn xếp tràn bạn phải cung cấp cho câu trả lời hoàn chỉnh ngay cả khi bạn đang tham chiếu một liên kết, bởi vì các liên kết có thể bị hỏng – atx

Các vấn đề liên quan