J'ai ajouté un champ 'annulé' à mon modèle. Y a-t-il un moyen de modifier la requête par défaut du modèle pour qu'elle soit annulée = Faux? sans avoir à modifier toutes mes requêtes de filtre/exclusion?Modifier le jeu de caractères par défaut dans django
Répondre
Vous pouvez le faire avec un gestionnaire de modèle personnalisé et remplacer la fonction get_queryset
pour toujours filtrer cancel = False.
class CustomManager(models.Manager):
def get_queryset(self):
return super(CustomManager, self).get_queryset().filter(canceled=False)
class MyModel(models.Model):
# Blah blah
objects = CustomManager()
Ensuite, en appelant le MyModel.objects.all()
, il exclura toujours les objets annulés. Voici un article de blog que j'ai trouvé utile sur le sujet. http://www.b-list.org/weblog/2006/aug/18/django-tips-using-properties-models-and-managers/
EDIT: Peut-être une meilleure approche avec un gestionnaire personnalisé serait de l'attacher à une autre propriété, autre que des objets, tels que:
class MyModel(models.Model):
# Blah blah
active = CustomManager()
Et dans vos vues vos questions ressembleraient MyModel.active.all()
.
EDIT2: Mise à jour de l'orthographe de la méthode de get_query_set
à get_queryset
pour les versions modernes de django.
Vous pouvez écrire query manager personnalisé, mais je ne crois pas que ce soit la bonne façon de procéder. Cela créerait une condition cachée implicite pour un filtre, ce qui rendrait le code illisible. Rappelez-vous Zen of Python: Explicit is better than implicit
. Détecter les lieux, où vous devez ajouter annulé = Faux et ajoutez-le, c'est comme cela que vous devriez le faire.
Je ne suis pas du tout d'accord. Quel serait alors le point d'avoir des gestionnaires personnalisés? Qu'est-ce qui est tellement implicite à propos de 'not_cancelled = CustomManager()' et ensuite en utilisant MyModel.not_cancelled.all()? – jonwd7
vous devez être très très prudent avec le gestionnaire par défaut remplaçant juste comme ça. Dans ce cas particulier, une fois l'élément annulé, vous ne le trouverez jamais avec filter()/get(). –
D'accord. Est-ce que je compléterais typiquement cette approche en donnant la priorité à get() pour ne pas utiliser ce filtre si le pk est donné. Vous voudrez probablement aussi changer le dossier d'administration pour retourner tout ce qui a été annulé. Mais si vous voulez rarement des éléments annulés dans vos requêtes, cela peut être une approche raisonnable. –
Salut, existe-t-il un moyen de modifier le comportement de get_query_set pour utiliser des paramètres supplémentaires, c'est-à-dire passés à partir de quelque part, ou utiliser des variables globales comme les informations de connexion actuelles? Merci! – ultrajohn