Opened 7 years ago

Closed 7 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)

ticket_25021_test.patch (672 bytes) - added by Andriy Sokolovskiy 7 years ago.

Download all attachments as: .zip

Change History (6)

comment:1 Changed 7 years ago by Tim Graham

If you could provide a failing test for Django's test suite that would be helpful.

Changed 7 years ago by Andriy Sokolovskiy

Attachment: ticket_25021_test.patch added

comment:2 Changed 7 years ago by Andriy Sokolovskiy

Cc: me@… added

comment:3 Changed 7 years ago by Andriy Sokolovskiy

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 Changed 7 years ago by Andriy Sokolovskiy

Component: Database layer (models, ORM)Documentation
Summary: HStore values query with contains does not actually workDocument differences between HStore values query with contains and standard __contains lookup
Triage Stage: UnreviewedAccepted
Type: BugNew 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 Changed 7 years ago by Anssi Kääriäinen

Resolution: invalid
Status: newclosed

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

Note: See TracTickets for help on using tickets.
Back to Top