diff --git a/HISTORY.rst b/HISTORY.rst index 5b0021cc..ce531517 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -2,6 +2,11 @@ History ======= +0.2.1 +----- + +- Support related `complement` lookups + 0.2.0 ----- diff --git a/lookup_extensions/__init__.py b/lookup_extensions/__init__.py index 2e0979ff..e510b88e 100644 --- a/lookup_extensions/__init__.py +++ b/lookup_extensions/__init__.py @@ -2,6 +2,6 @@ __author__ = """UNCOVER TRUTH Inc.""" __email__ = 'develop@uncovertruth.co.jp' -__version__ = '0.2.0' +__version__ = '0.2.1' default_app_config = 'lookup_extensions.apps.LookupExtensionsConfig' diff --git a/lookup_extensions/backends/base/operations.py b/lookup_extensions/backends/base/operations.py index 85af7554..c3ff1373 100644 --- a/lookup_extensions/backends/base/operations.py +++ b/lookup_extensions/backends/base/operations.py @@ -1,5 +1,8 @@ # Load lookup types -from lookup_extensions import lookups # noqa F401 +from lookup_extensions import ( # noqa F401 + lookups, + related_lookups, +) class ExtendedDatabaseOperationsMixin(object): diff --git a/lookup_extensions/lookups/__init__.py b/lookup_extensions/lookups/__init__.py index 096c19bf..4843f09d 100644 --- a/lookup_extensions/lookups/__init__.py +++ b/lookup_extensions/lookups/__init__.py @@ -1,3 +1,3 @@ -from .exists import * # noqa F401,F403 +from .complements import * # noqa F401,F403 from .exregex import * # noqa F401,F403 from .negate import * # noqa F401,F403 diff --git a/lookup_extensions/lookups/exists.py b/lookup_extensions/lookups/complements.py similarity index 100% rename from lookup_extensions/lookups/exists.py rename to lookup_extensions/lookups/complements.py diff --git a/lookup_extensions/related_lookups/__init__.py b/lookup_extensions/related_lookups/__init__.py new file mode 100644 index 00000000..b3a8aef4 --- /dev/null +++ b/lookup_extensions/related_lookups/__init__.py @@ -0,0 +1 @@ +from .complements import * # noqa F401,F403 diff --git a/lookup_extensions/related_lookups/complements.py b/lookup_extensions/related_lookups/complements.py new file mode 100644 index 00000000..5f340865 --- /dev/null +++ b/lookup_extensions/related_lookups/complements.py @@ -0,0 +1,11 @@ +from django.db.models.fields.related import ForeignObject +from django.db.models.fields.related_lookups import RelatedLookupMixin + +from lookup_extensions.lookups import Complement + + +class RelatedComplement(RelatedLookupMixin, Complement): + pass + + +ForeignObject.register_lookup(RelatedComplement) diff --git a/tests/test_lookup/tests.py b/tests/test_lookup/tests.py index 1d4ab7d3..f6ada74b 100644 --- a/tests/test_lookup/tests.py +++ b/tests/test_lookup/tests.py @@ -16,6 +16,7 @@ try: from lookup.models import ( Article, + Author, Game, Player, Season, @@ -1187,3 +1188,21 @@ def test_negate_complement(self): '', ], ) + + def test_related_complement(self): + tags = Tag.objects.filter(articles__author=OuterRef('id'), name='Tag 2') + self.assertEqual( + [a.name for a in Author.objects.filter( + article__headline__startswith='Article', + article__tag__complement=Exists(tags)).distinct()], + ['Author 1', 'Author 2'], + ) + + def test_negate_related_complement(self): + tags = Tag.objects.filter(articles__author=OuterRef('id'), name='Tag 2') + self.assertEqual( + [a.name for a in Author.objects.filter( + article__headline__startswith='Article', + article__tag__complement=~Exists(tags)).distinct()], + [], + )