Opened 7 years ago
Closed 5 years ago
#29429 closed Bug (needsinfo)
Make len lookup for ArrayField use the array_length function
Reported by: | creative3000 | Owned by: | |
---|---|---|---|
Component: | contrib.postgres | Version: | 2.0 |
Severity: | Normal | Keywords: | db orm ArrayField postgres |
Cc: | Triage Stage: | Accepted | |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description (last modified by )
When you filter by len like in documentation example:
Post.objects.filter(tags__len=1)
But if you try to annotate something an error pops up example:
Post.objects.all().annotate(tag_len=F('tags__len'))
It really seems that it should work by default, but instead I needed to use something like this
Post.objects.all().annotate(tag_len=Func(F('tags'), 1, function='array_length'))
Change History (5)
comment:1 by , 7 years ago
Description: | modified (diff) |
---|
comment:2 by , 7 years ago
Description: | modified (diff) |
---|---|
Owner: | changed from | to
Status: | new → assigned |
comment:3 by , 7 years ago
Component: | Database layer (models, ORM) → contrib.postgres |
---|---|
Easy pickings: | unset |
Summary: | Postgres ArrayField doesn't work properly. → Make len lookup for ArrayField use the array_length function |
Triage Stage: | Unreviewed → Accepted |
comment:4 by , 7 years ago
Owner: | removed |
---|---|
Status: | assigned → new |
comment:5 by , 5 years ago
Resolution: | → needsinfo |
---|---|
Status: | new → closed |
Are you sure the line Post.objects.all().annotate(tag_len=F('tags__len'))
is valid?
Where did you read in the documentation a similar construct with a Transform inside a F()
expression?
In my opinion, you should have written:
from django.contrib.postgres.fields.array import ArrayLenTransform Post.objects.all().annotate(tag_len=ArrayLenTransform('tags'))
Note:
See TracTickets
for help on using tickets.
I haven't dug into this. It might be fine. Accepting for further investigation.