#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.