Das Recipe Model um einen Manager erweitern

Jedes Model hat mindestes einen Manager, nämlich objects. Diesen Default Manager kann man ersetzen oder man kann weitere Manager schreiben, um bestimmte Gruppen von Models zu erhalten.

Dazu erstellst du in recipes/models.py eine neue Klasse ActiveRecipeManager:

class ActiveRecipeManager(models.Manager):
    def get_query_set(self):
        return super(ActiveRecipeManager, self).get_query_set().filter(is_active=True)

class Recipe(models.Model):
    ...
    is_active = models.BooleanField(u'Aktiv')

    objects = models.Manager()
    active = ActiveRecipeManager()

    def get_related_recipes(self):
        categories = self.category.all()
        related_recipes = Recipe.active.all().filter(
            difficulty__exact=self.difficulty, category__in=categories)
        return related_recipes.exclude(pk=self.id).distinct()

Wichtig ist, dass nicht der Name sondern die Position den Default Manager bestimmt: Der erste Manager, der definiert wird, ist der Default Manager - egal wie er heisst.

So kann man den neuen Manager in recipes/views.py einsetzen:

class RecipeListView(ListView):
    template_name = 'recipes/index.html'

    def get_queryset(self):
        recipes = Recipe.active.all()
        logger.debug('Anzahl der Rezepte: %d' % recipes.count())
        return recipes


class RecipeDetailView(DetailView):
    queryset = Recipe.active.all()
    template_name = 'recipes/detail.html'

Inhalt

Vorheriges Thema

Mehrere Datenbanken nutzen

Nächstes Thema

Anpassung des Admin Backends

Diese Seite