Die Grenzen der API

Meine erste Tag Cloud konnte ich dank Djangos QuerySet-API mit einer einzigen Zeile (abgesehen von from django.db.models import Count) füllen:

tags = Tag.objects.annotate(num_pages=Count('page')).filter(num_pages__gt=0)

Da die Beziehung zwischen Page und Tag über ein ManyToMany-Feld im Page-Modell definiert ist, führe ich eine umgekehrte M2M-Abfrage durch und verwende die annotate- bzw. count-Funktionen (neu in Django 1.1), um eine Liste derjenigen Tags abzurufen, mit denen mindestens eine Seite verknüpft ist. Wow.

Leider reicht mir das nicht. Seit ich Bruce Tognazzinis Eloge auf den Keyword Manager gelesen habe, will ich auch ein Tagging-System, das hierarchisch übergeordnete Tags automatisch zuweist. Das ist leider nicht mit einer einzigen Zeile zu haben:

# views.py: tags = Tag.objects.all() results = [] for tag in tags: if tag.page_count > 0 and tag.id != 31: results.append(tag) # models.py: def _get_tagged_pages(self): queryset = list(self.page_set.defer('content', 'texcontent').all()) for child_tag in self.child_set.all(): if child_tag.page_set.all(): queryset.extend(child_tag.tagged_pages) return list(set(queryset)) tagged_pages = property(_get_tagged_pages) def _get_page_count(self): page_count = len(self.tagged_pages) return page_count page_count = property(_get_page_count)

Immerhin kann ich das teure Attribut tagged_pages noch an anderer Stelle verwenden.