Opened 9 years ago
Closed 9 years ago
#25021 closed New feature (invalid)
Document differences between HStore values query with contains and standard __contains lookup
Reported by: | amagidow | Owned by: | nobody |
---|---|---|---|
Component: | Documentation | Version: | 1.8 |
Severity: | Normal | Keywords: | HStore, Postgresql, queries |
Cc: | me@… | Triage Stage: | Accepted |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
When using an HStore __values
query with __contains
chained on to it, the query does not work as expected in Django 1.8.2. Expected action is that any values which contain the text will be returned from the query.
From my own app (I've removed some of the queryset results to make this easier to read)
>>> query1 [<LanguageDatum: \xf0i, This (m), And, >, <LanguageDatum: hadi, This (f), AfgA, >, <LanguageDatum: -e, His, ArBah, >, '...(remaining elements truncated)...'] >>> query1.filter(multigloss__values__contains=["This"]) [] >>> query1.filter(multigloss__values__contains=["This (f)"]) [<LanguageDatum: hadi, This (f), AfgA, >, <LanguageDatum: \xf0i, This (f), ArAnz, >, '...(remaining elements truncated)...'] >>> query1.filter(multigloss__values__contains=["His"]) [<LanguageDatum: -e, His, ArBah, >, <LanguageDatum: -eh, His, ArBah, >, <LanguageDatum: -hu, His, Chd, >, <LanguageDatum: -u, His, Chd, > '...(remaining elements truncated)...'] >>> query1.filter(multigloss__values__contains=["Hi"]) []
The expected result would be that the queries would return any data whose 'multigloss' values contain the string, not only those strings which are exactly identical.
The example in the documentation should also fail if you did not include the entire word "collie" (I have not tested, this is a hypothesized result):
>>> Dog.objects.create(name='Rufus', data={'breed': 'labrador'}) >>> Dog.objects.create(name='Meg', data={'breed': 'collie', 'owner': 'Bob'}) >>> Dog.objects.filter(data__values__contains=['collie']) [<Dog: Meg>] >>>#Hypothesized example! >>> Dog.objects.filter(data__values__contains=['coll']) [] >>>#Should have returned [Dog: Meg]
If this is not how __values__contains
is supposed to work, this should be clarified in the documentation since it is extremely unclear how to do a search for values within the HStore that match a certain criterion (such as containing a string).
Attachments (1)
Change History (6)
comment:1 by , 9 years ago
by , 9 years ago
Attachment: | ticket_25021_test.patch added |
---|
comment:2 by , 9 years ago
Cc: | added |
---|
comment:3 by , 9 years ago
Seems to be postgresql behavior, I'll look deeper
dev2=# SELECT ARRAY['abc'] @> ARRAY['abc']; ?column? ---------- t (1 row) dev2=# SELECT ARRAY['abc'] @> ARRAY['ab']; ?column? ---------- f (1 row)
comment:4 by , 9 years ago
Component: | Database layer (models, ORM) → Documentation |
---|---|
Summary: | HStore values query with contains does not actually work → Document differences between HStore values query with contains and standard __contains lookup |
Triage Stage: | Unreviewed → Accepted |
Type: | Bug → New feature |
Maybe it can be hacked in some way, but I'm don't think we should change behavior of database function here.
I'm accepting this because IMO it will be useful document differences between https://docs.djangoproject.com/en/1.8/ref/models/querysets/#contains and this case, to not confuse users that may also meet this issue.
comment:5 by , 9 years ago
Resolution: | → invalid |
---|---|
Status: | new → closed |
The array field works as expected, the ArrayField overrides the contains lookup, see https://docs.djangoproject.com/en/1.8/ref/contrib/postgres/fields/#contains
If you could provide a failing test for Django's test suite that would be helpful.