Skip to content

Commit

Permalink
Add HasAnyKeys lookup for HStoreField.
Browse files Browse the repository at this point in the history
  • Loading branch information
mjtamlyn committed May 30, 2015
1 parent 38eacbd commit 74fe442
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 12 deletions.
15 changes: 3 additions & 12 deletions django/contrib/postgres/fields/hstore.py
Expand Up @@ -55,18 +55,9 @@ def formfield(self, **kwargs):

HStoreField.register_lookup(lookups.DataContains)
HStoreField.register_lookup(lookups.ContainedBy)


@HStoreField.register_lookup
class HasKeyLookup(lookups.PostgresSimpleLookup):
lookup_name = 'has_key'
operator = '?'


@HStoreField.register_lookup
class HasKeysLookup(lookups.PostgresSimpleLookup):
lookup_name = 'has_keys'
operator = '?&'
HStoreField.register_lookup(lookups.HasKey)
HStoreField.register_lookup(lookups.HasKeys)
HStoreField.register_lookup(lookups.HasAnyKeys)


class KeyTransform(Transform):
Expand Down
15 changes: 15 additions & 0 deletions django/contrib/postgres/lookups.py
Expand Up @@ -30,6 +30,21 @@ class Overlap(PostgresSimpleLookup):
operator = '&&'


class HasKey(PostgresSimpleLookup):
lookup_name = 'has_key'
operator = '?'


class HasKeys(PostgresSimpleLookup):
lookup_name = 'has_keys'
operator = '?&'


class HasAnyKeys(PostgresSimpleLookup):
lookup_name = 'has_any_keys'
operator = '?|'


class Unaccent(FunctionTransform):
bilateral = True
lookup_name = 'unaccent'
Expand Down
17 changes: 17 additions & 0 deletions docs/ref/contrib/postgres/fields.txt
Expand Up @@ -385,6 +385,23 @@ Returns objects where the given key is in the data. Uses the SQL operator
>>> Dog.objects.filter(data__has_key='owner')
[<Dog: Meg>]

.. fieldlookup:: hstorefield.has_any_keys

has_any_keys
~~~~~~~~~~~~

.. versionadded:: 1.9

Returns objects where any of the given keys are in the data. Uses the SQL
operator ``?|``. For example::

>>> Dog.objects.create(name='Rufus', data={'breed': 'labrador'})
>>> Dog.objects.create(name='Meg', data={'owner': 'Bob'})
>>> Dog.objects.create(name='Fred', data={})

>>> Dog.objects.filter(data__has_any_keys=['owner', 'breed'])
[<Dog: Rufus>, <Dog: Meg>]

.. fieldlookup:: hstorefield.has_keys

has_keys
Expand Down
6 changes: 6 additions & 0 deletions tests/postgres_tests/test_hstore.py
Expand Up @@ -79,6 +79,12 @@ def test_has_keys(self):
self.objs[1:2]
)

def test_has_any_keys(self):
self.assertSequenceEqual(
HStoreModel.objects.filter(field__has_any_keys=['a', 'c']),
self.objs[:3]
)

def test_key_transform(self):
self.assertSequenceEqual(
HStoreModel.objects.filter(field__a='b'),
Expand Down

0 comments on commit 74fe442

Please sign in to comment.