Opened 5 years ago
Closed 5 years ago
#31340 closed New feature (fixed)
Improve expression support for __search lookup and SearchQuery
Reported by: | Baptiste Mispelon | Owned by: | Baptiste Mispelon |
---|---|---|---|
Component: | contrib.postgres | Version: | dev |
Severity: | Normal | Keywords: | |
Cc: | Triage Stage: | Ready for checkin | |
Has patch: | yes | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
(not sure whether to categorize this as a bug or a new feature)
I've been trying to implement some kind of reverse full text search where I store keywords in the database and I want to query models whose keywords would match a given piece of text.
Here's a simplified model of what I'm working with:
class SavedSearch(models.Model): keywords = models.TextField() def __str__(self): return self.keywords
I've managed to achieve what I want in the case of the default search configuration using annotation and wrapping things with Value
or Cast
:
# This works search_query = Cast('keywords', output_field=SearchQueryField()) search_vector = SearchVector(Value("lorem ipsum ...", output_field=TextField())) qs = SavedSearch.objects.annotate(search=search_vector).filter(search=search_query)
But if I want to use a custom search configuration, things don't work anymore:
# This doesn't work (can't adapt type 'F') search_query = SearchQuery(F('keywords'), config='english', search_type='plain') search_vector = SearchVector(Value("lorem ipsum ...", output_field=TextField())) qs = SavedSearch.objects.annotate(search=search_vector).filter(search=search_query)
I'm not very familiar with the inner workings of Lookup
objects but I did some digging and I think I came up with a fix which involved fixing two separate issues:
1) SearchQuery
doesn't currently support anyting other than plain values (str
). Fixing this required changing both resolve_expression()
and as_sql()
.
2) the __search
lookup doesn't support things like F
objects because of it assumes that any value with a resolve_expression
method must be a SearchQuery
object.
Change History (6)
comment:1 by , 5 years ago
comment:2 by , 5 years ago
Triage Stage: | Unreviewed → Accepted |
---|
comment:3 by , 5 years ago
Owner: | set to |
---|---|
Status: | new → assigned |
comment:5 by , 5 years ago
Triage Stage: | Accepted → Ready for checkin |
---|---|
Version: | 3.0 → master |
Pull request here: https://github.com/django/django/pull/12525