Loading django/contrib/postgres/fields/hstore.py +3 −12 Original line number Diff line number Diff line Loading @@ -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): Loading django/contrib/postgres/lookups.py +15 −0 Original line number Diff line number Diff line Loading @@ -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' Loading docs/ref/contrib/postgres/fields.txt +17 −0 Original line number Diff line number Diff line Loading @@ -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 Loading tests/postgres_tests/test_hstore.py +6 −0 Original line number Diff line number Diff line Loading @@ -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'), Loading Loading
django/contrib/postgres/fields/hstore.py +3 −12 Original line number Diff line number Diff line Loading @@ -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): Loading
django/contrib/postgres/lookups.py +15 −0 Original line number Diff line number Diff line Loading @@ -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' Loading
docs/ref/contrib/postgres/fields.txt +17 −0 Original line number Diff line number Diff line Loading @@ -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 Loading
tests/postgres_tests/test_hstore.py +6 −0 Original line number Diff line number Diff line Loading @@ -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'), Loading