Django Définir des gestionnaires personnalisés


Exemple

Très souvent, il s'agit de modèles qui ont quelque chose comme un champ published . Ces types de champs sont presque toujours utilisés lors de la récupération d'objets, de sorte que vous vous retrouvez à écrire quelque chose comme:

my_news = News.objects.filter(published=True)

trop de fois. Vous pouvez utiliser des gestionnaires personnalisés pour gérer ces situations, de sorte que vous puissiez ensuite écrire quelque chose comme:

my_news = News.objects.published()

ce qui est plus agréable et plus facile à lire par les autres développeurs.

Créez un fichier managers.py dans votre répertoire d'application et définissez une nouvelle classe models.Manager :

from django.db import models


class NewsManager(models.Manager):

    def published(self, **kwargs):
        # the method accepts **kwargs, so that it is possible to filter
        # published news
        # i.e: News.objects.published(insertion_date__gte=datetime.now)
        return self.filter(published=True, **kwargs)

utilisez cette classe en redéfinissant la propriété objects dans la classe de modèle:

from django.db import models

# import the created manager
from .managers import NewsManager

class News(models.Model):
    """ News model
    """
    insertion_date = models.DateTimeField('insertion date', auto_now_add=True)
    title = models.CharField('title', max_length=255)
    # some other fields here
    published = models.BooleanField('published')

    # assign the manager class to the objects property
    objects = NewsManager()

Maintenant, vous pouvez obtenir vos nouvelles publiées simplement de cette manière:

my_news = News.objects.published()

et vous pouvez également effectuer plus de filtrage:

my_news = News.objects.published(title__icontains='meow')