Kaydet (Commit) 74fe4428 authored tarafından Marc Tamlyn's avatar Marc Tamlyn

Add HasAnyKeys lookup for HStoreField.

üst 38eacbde
......@@ -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):
......
......@@ -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'
......
......@@ -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
......
......@@ -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'),
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment