#18221 closed New feature (wontfix)
Add "Length" database function
Reported by: | Danilo Bargen | Owned by: | nobody |
---|---|---|---|
Component: | Database layer (models, ORM) | Version: | 1.3 |
Severity: | Normal | Keywords: | |
Cc: | Triage Stage: | Unreviewed | |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | yes | UI/UX: | no |
Description
Maybe I'm blind, but I can't find a way to use aggregation functions on the length of a database field.
I want to achieve the following:
SELECT MAX(LENGTH(name)) AS max_name_length FROM table;
The natural way to do this with the Django ORM would be something like this:
Model.objects.annotate(name_length=Length('name')).aggregate(Max('name_length'))
Unfortunately there is no such Length()
function. A workaround of doing the annotation would be using extra(select={'name_length': 'LENGTH(name)'})
, but then the aggregation doesn't work anymore.
My suggestion would be to add such a Length()
function.
Change History (3)
comment:1 by , 13 years ago
Resolution: | → wontfix |
---|---|
Status: | new → closed |
comment:2 by , 13 years ago
Also, from memory, Length
isn't in SQL-92 (I didn't check, feel free to prove me wrong).
comment:3 by , 12 years ago
Component: | ORM aggregation → Database layer (models, ORM) |
---|
The best you can currently do is creating a custom aggregate,
MaxLength
. I think it should be somewhat straightforward to do so, you can use django/db/models/sql/aggregates.py and django/db/models/aggregates.py as guidance. The key is to make it like Max, except the template should be MAX(LENGTH()) instead of just MAX().I do not support adding a Length function to Django. However it would be a good idea to allow users to define their own SQL snippets. Something like:
and you could use the self-defined Length like you did in your .annotate() example.
I am closing this wontfix as I don't see adding different SQL functions into Django core as the right way forward.