tortoise / tortoise/tortoise-orm
icontains fails when the parameter is F()
Open
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 5.6k
- Forks
- 516
- Avg merge
- 2d 21h
- Merged PRs (30d)
- 9
Description
Describe the bug
Filters such as icontains and contains don't support F.
To Reproduce
objects = await (
MyObjects.filter(object_url__icontains=F('actual_url'))
)
[ERROR] controllers.BaseController: 'F' object has no attribute 'replace'
Traceback (most recent call last):
...
stores = await (
File "/home/efilatov/.local/share/virtualenvs/ivy-svc-BE_tornado-ehmxdpsN/lib/python3.8/site-packages/tortoise/queryset.py", line 958, in __await__
self._make_query()
File "/home/efilatov/.local/share/virtualenvs/ivy-svc-BE_tornado-ehmxdpsN/lib/python3.8/site-packages/tortoise/queryset.py", line 920, in _make_query
self.resolve_filters(
File "/home/efilatov/.local/share/virtualenvs/ivy-svc-BE_tornado-ehmxdpsN/lib/python3.8/site-packages/tortoise/queryset.py", line 130, in resolve_filters
modifier &= node.resolve(model, annotations, custom_filters, model._meta.basetable)
File "/home/efilatov/.local/share/virtualenvs/ivy-svc-BE_tornado-ehmxdpsN/lib/python3.8/site-packages/tortoise/query_utils.py", line 390, in resolve
return self._resolve_kwargs(model, table)
File "/home/efilatov/.local/share/virtualenvs/ivy-svc-BE_tornado-ehmxdpsN/lib/python3.8/site-packages/tortoise/query_utils.py", line 348, in _resolve_kwargs
filter_modifier = self._resolve_regular_kwarg(model, key, value, table)
File "/home/efilatov/.local/share/virtualenvs/ivy-svc-BE_tornado-ehmxdpsN/lib/python3.8/site-packages/tortoise/query_utils.py", line 307, in _resolve_regular_kwarg
criterion, join = _process_filter_kwarg(model, key, value, table)
File "/home/efilatov/.local/share/virtualenvs/ivy-svc-BE_tornado-ehmxdpsN/lib/python3.8/site-packages/tortoise/query_utils.py", line 45, in _process_filter_kwarg
criterion = param["operator"](table[param["source_field"]], encoded_value)
File "/home/efilatov/.local/share/virtualenvs/ivy-svc-BE_tornado-ehmxdpsN/lib/python3.8/site-packages/tortoise/backends/mysql/executor.py", line 73, in mysql_insensitive_contains
functions.Upper(StrWrapper(f"%{escape_like(value)}%")),
File "/home/efilatov/.local/share/virtualenvs/ivy-svc-BE_tornado-ehmxdpsN/lib/python3.8/site-packages/tortoise/backends/mysql/executor.py", line 45, in escape_like
return val.replace("\\", "\\\\\\\\").replace("%", "\\%").replace("_", "\\_")
AttributeError: 'F' object has no attribute 'replace'
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start in tortoise/query_utils.py at _process_filter_kwarg and the filter-resolution path shown in the traceback, then inspect tortoise/backends/mysql/executor.py, especially mysql_insensitive_contains and escape_like. Add coverage for contains and icontains with F('actual_url'), and confirm the filters resolve without the reported AttributeError.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- mysql, python
- Domain
- database
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100