2017-08-14 7 views
0

J'ai un gestionnaire de modèle personnalisé et un jeu de requête personnalisé défini spécifiquement pour l'obj connexe, ce qui signifie que j'ai défini Meta.base_manager_name dans le modèle.Django - Meta.base_manager_name - fait un argument dans le jeu de requêtes et le gestionnaire personnalisés

Je voudrais utiliser une méthode gestionnaire all() qui récupère l'obj correspondant sur un OneToOneFeild. Maintenant, je sais que cela n'a pas de sens puisque OneToOneFeild retournera toujours un obj, il n'y a pas besoin d'une méthode all(). Je travaille sur le projet django-oscar et j'élargis son modèle "Partner". Il a à l'origine un champ "utilisateurs" avec ManyToManyField et maintenant changé en OneToOneFeild.

Le champ users est appelé plusieurs fois en utilisant la relation user.partners.all(). Je ne veux pas prolonger/modifier tous ces endroits (suis-je paresseux ici?) Puisque je veux garder le code aussi amical que possible et donc je voulais avoir tout() gestionnaire de modèle défini qui fonctionnera. Vous ne savez pas si c'est une bonne idée?

la toute méthode prend arg utilisateur pour revenir queryset de l'instance utilisateur

class PartnerQuerySet(models.QuerySet): 
    def all(self, user): 
     return self.filter(user=user) 

class PartnerManager(models.Manager): 

    def get_queryset(self): 
     return PartnerQuerySet(self.model, using=self._db) 

    def all(self, user): 
     return self.get_queryset().all(users) 

class Partner(models.Model): 
    objects = PartnerManager() 

    class Meta: 
     base_manager_name = 'objects' 

Le problème() est quand il est utilisé avec liée obj il demande arg utilisateur ce qui est logique, mais depuis que je l'utilise avec un obj lié que je voulais utiliser l'obj comme lié arg donc,

user.partner.all() - should use user as arg and fetch the results 

user.partner.all(user) - and I should not have to do the below 

2 questions connexes: 1) Est-ce du sens - dois-je faire cela? 2) comment je peux atteindre user.partner.all() sans ajouter d'utilisateur dans arg

PS: Je sais que je peux travailler avec middleware pour get_current_user mais cette fonction n'est pas fiable selon certaines des réponses à une question différente sur SO.

Répondre

1

Je ne pense pas que ce que vous essayez de faire fonctionnera. Votre nouvelle situation avec OneToOneField vous donne l'instance partenaire.

>>>> user.partner 
<Partner xxx> 

Alors que dans l'ancienne situation avec le ManyToManyField, le PartnerQuerySet aurait été retourné.

>>>> user.partner 
<PartnerQuerySet []> 

Une solution serait de créer une coutume OneToOneField, mais cela le plus violent probablement la règle « simple est mieux que complexe » et à la fin peut-être même plus de travail que de changer tous les .all() « s existants.