#31340: Improve expression support for __search lookup and SearchQuery
---------------------------------------------+------------------------
               Reporter:  Baptiste Mispelon  |          Owner:  (none)
                   Type:  New feature        |         Status:  new
              Component:  contrib.postgres   |        Version:  3.0
               Severity:  Normal             |       Keywords:
           Triage Stage:  Unreviewed         |      Has patch:  1
    Needs documentation:  0                  |    Needs tests:  0
Patch needs improvement:  0                  |  Easy pickings:  0
                  UI/UX:  0                  |
---------------------------------------------+------------------------
 ''(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:
 {{{#!python
 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`:

 {{{#!python
 # 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:

 {{{#!python
 # 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.

-- 
Ticket URL: <https://code.djangoproject.com/ticket/31340>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-updates+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/052.8ba001122d6e0b925f9907aa056c5852%40djangoproject.com.

Reply via email to