Add HasAnyKeys lookup for HStoreField.

This commit is contained in:
Marc Tamlyn 2015-05-30 21:22:36 +01:00
parent 38eacbde62
commit 74fe4428e5
4 changed files with 41 additions and 12 deletions

View File

@ -55,18 +55,9 @@ class HStoreField(Field):
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):

View File

@ -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'

View File

@ -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

View File

@ -79,6 +79,12 @@ class TestQuerying(PostgresSQLTestCase):
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'),