Hello!
I faced with the performance issue while searching in admin by long string.
I have CompanyAdmin.search_fields = ['business_name', 
'contact_persons__name',]
and tried to find company by name like ''COMPANY - REAL ESTATE COMPANY 
NAME" and query handling took about 7 minutes. (There are about 3000 
company objects)

While investigating I found that there a lot of outer joins of 
contact_persons table (for each splitted word from search string).

in BaseModelAdmin.get_search_results

for bit in search_term.split():
    or_queries = [models.Q(**{orm_lookup: bit}) for orm_lookup in 
orm_lookups]
    queryset = queryset.filter(reduce(operator.or_, or_queries))


as I understand, joins that I wrote above are the result of queryset.filter

After I change it for:

Q_obj = Q()
...

for bit in search_term.split():
    or_queries = [models.Q(**{orm_lookup: bit}) for orm_lookup in 
orm_lookups]
    Q_obj &= reduce(operator.or_, or_queries)
queryset = queryset.filter(Q_obj)

...


my query was handled immediately. So the question is, if it is right 
solution and can it cause any other issues?

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/24147884-9d9b-40b6-bc17-b36fcaeae23c%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to