Commit 74fe4428 authored by Marc Tamlyn's avatar Marc Tamlyn
Browse files

Add HasAnyKeys lookup for HStoreField.

parent 38eacbde
Loading
Loading
Loading
Loading
+3 −12
Original line number Diff line number Diff line
@@ -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):
+15 −0
Original line number Diff line number Diff line
@@ -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'
+17 −0
Original line number Diff line number Diff line
@@ -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
+6 −0
Original line number Diff line number Diff line
@@ -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'),