From fa6808e9b35622bef7fd6d038ea61c4eaf5ee8c7 Mon Sep 17 00:00:00 2001 From: Adam Donaghy Date: Thu, 20 Aug 2020 12:34:17 +1000 Subject: [PATCH] Use conditional function definition --- polymorphic/query.py | 60 +++++++++++++++++++++----------------------- 1 file changed, 29 insertions(+), 31 deletions(-) diff --git a/polymorphic/query.py b/polymorphic/query.py index 54ee0ee..8b0259b 100644 --- a/polymorphic/query.py +++ b/polymorphic/query.py @@ -158,18 +158,34 @@ class PolymorphicQuerySet(QuerySet): # Implementation in _translate_polymorphic_filter_defnition.""" return self.filter(not_instance_of=args) - def _filter_or_exclude(self, negate, *args, **kwargs): - # We override this internal Django function as it is used for all filter member functions. - q_objects = translate_polymorphic_filter_definitions_in_args( - self.model, args, using=self.db - ) - # filter_field='data' - additional_args = translate_polymorphic_filter_definitions_in_kwargs( - self.model, kwargs, using=self.db - ) - return super(PolymorphicQuerySet, self)._filter_or_exclude( - negate, *(list(q_objects) + additional_args), **kwargs - ) + # Makes _filter_or_exclude compatible with the change in signature introduced in django at 9c9a3fe + if get_django_version() >= "3.2": + def _filter_or_exclude(self, negate, args, kwargs): + # We override this internal Django function as it is used for all filter member functions. + q_objects = translate_polymorphic_filter_definitions_in_args( + queryset_model=self.model, args=args, using=self.db + ) + # filter_field='data' + additional_args = translate_polymorphic_filter_definitions_in_kwargs( + queryset_model=self.model, kwargs=kwargs, using=self.db + ) + args = list(q_objects) + additional_args + return super(PolymorphicQuerySet, self)._filter_or_exclude( + negate=negate, args=args, kwargs=kwargs + ) + else: + def _filter_or_exclude(self, negate, *args, **kwargs): + # We override this internal Django function as it is used for all filter member functions. + q_objects = translate_polymorphic_filter_definitions_in_args( + self.model, args, using=self.db + ) + # filter_field='data' + additional_args = translate_polymorphic_filter_definitions_in_kwargs( + self.model, kwargs, using=self.db + ) + return super(PolymorphicQuerySet, self)._filter_or_exclude( + negate, *(list(q_objects) + additional_args), **kwargs + ) def order_by(self, *field_names): """translate the field paths in the args, then call vanilla order_by.""" @@ -522,22 +538,4 @@ class PolymorphicQuerySet(QuerySet): if not self.model.polymorphic_query_multiline_output: return olist clist = PolymorphicQuerySet._p_list_class(olist) - return clist - - -# Makes _filter_or_exclude compatible with the change in signature introduced in django at 9c9a3fe -if get_django_version() >= "3.2": - def _filter_or_exclude(self, negate, args, kwargs): - # We override this internal Django function as it is used for all filter member functions. - q_objects = translate_polymorphic_filter_definitions_in_args( - queryset_model=self.model, args=args, using=self.db - ) - # filter_field='data' - additional_args = translate_polymorphic_filter_definitions_in_kwargs( - queryset_model=self.model, kwargs=kwargs, using=self.db - ) - args = list(q_objects) + additional_args - return super(PolymorphicQuerySet, self)._filter_or_exclude( - negate=negate, args=args, kwargs=kwargs - ) - PolymorphicQuerySet._filter_or_exclude = _filter_or_exclude + return clist \ No newline at end of file