X-Git-Url: https://git.mdrn.pl/wolnelektury.git/blobdiff_plain/0e9ce396fab5cdfc2f1806bae43f05de77cb1e21..bd6eceb9cd8e613c289f612ade962535741e2699:/apps/newtagging/models.py diff --git a/apps/newtagging/models.py b/apps/newtagging/models.py index 3f666812c..ead442f31 100644 --- a/apps/newtagging/models.py +++ b/apps/newtagging/models.py @@ -104,6 +104,7 @@ class TagManager(models.Manager): of field lookups to be applied to the given Model as the ``filters`` argument. """ + # TODO: Do we really need this filters stuff? if filters is None: filters = {} queryset = model._default_manager.filter() @@ -158,18 +159,15 @@ class TaggedItemManager(models.Manager): """ queryset, model = get_queryset_and_model(queryset_or_model) tags = self.tag_model.get_tag_list(tags) - tag_count = len(tags) - if not tag_count: + if not tags: # No existing tags were given return queryset.none() - elif tag_count == 1: - # Optimisation for single tag - fall through to the simpler - # query below. - return queryset.filter(tag_relations__tag=tags[0]) # TODO: presumes reverse generic relation - return queryset.filter(tag_relations__tag__in=tags - ).annotate(count=models.Count('pk')).filter(count=len(tags)) + # Multiple joins are WAY faster than having-count, at least on Postgres 9.1. + for tag in tags: + queryset = queryset.filter(tag_relations__tag=tag) + return queryset def get_union_by_model(self, queryset_or_model, tags): """ @@ -230,8 +228,8 @@ def create_intermediary_table_model(model): class TagMeta(ModelBase): "Metaclass for tag models (models inheriting from TagBase)." - def __new__(cls, name, bases, attrs): - model = super(TagMeta, cls).__new__(cls, name, bases, attrs) + def __new__(mcs, name, bases, attrs): + model = super(TagMeta, mcs).__new__(mcs, name, bases, attrs) if not model._meta.abstract: # Create an intermediary table and register custom managers for concrete models model.intermediary_table_model = create_intermediary_table_model(model)