Opened 11 years ago
Closed 11 years ago
#23493 closed New feature (fixed)
Defining bilateral lookup transformations
| Reported by: | Thomas C | Owned by: | nobody |
|---|---|---|---|
| Component: | Database layer (models, ORM) | 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
With the current Transform API, transformations are applied to the left-hand side of the lookup only.
For instance, if you define some unaccent Transform performing the SQL operation UNACCENT(...), the query below won't return an Author with first name Jérémie. Actually, it won't ever return anything.
Author.objects.filter(first_name__unaccent__iexact="Jérémie")
I think it would be great to be able to define custom transformations which would apply to both sides of the lookup. This would be particularly helpful when you want to perform some lookup insensitive to some SQL transformation (unaccent or other).
Change History (4)
comment:1 by , 11 years ago
| Triage Stage: | Unreviewed → Accepted |
|---|
comment:2 by , 11 years ago
| Triage Stage: | Accepted → Ready for checkin |
|---|---|
| Type: | Uncategorized → New feature |
Needs a more thorough ORM review, but looking good to me.
comment:3 by , 11 years ago
I updated the PR with a specific error message when trying to apply a bilateral transformation to a nested QuerySet (see https://github.com/django/django/pull/3225/files#diff-b6b218ec29b7fb6a7d89868a94bfc73eR94) — thanks to akaariai for pointing out this case.
We cannot handle a nested QuerySet as we would have to "push" our transformation into that QuerySet, which would require some tricky code for a very unusual use case.
comment:4 by , 11 years ago
| Resolution: | → fixed |
|---|---|
| Status: | new → closed |
I am going to mark this as accepted assuming the API is opt-in. We already have a precedence of doing this for lower lookup. We could actually remove the lower lookup from Django, and replace it with a bilateral transform.