Opened 7 years ago
Closed 6 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 , 6 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.