2015-07-23 1 views
3

Les documentation affiche comment enregistrer un objet dans une variable prélecture():Django: Enregistrer plusieurs prélecture() objets dans une variable ou une méthode

>>> prefetch = Prefetch('choice_set', queryset=voted_choices, to_attr='voted_choices') 
>>> Question.objects.prefetch_related(prefetch).get().voted_choices 
[<Choice: The sky>] 

Cependant, prefetch_related accepte beaucoup prélecture() des objets séparés avec virgule:

>>> Question.objects.prefetch_related(Prefetch('choice_set'), Prefetch('foo')).get().voted_choices 

Comment cette séquence prélecture() peut être sauvé dans une variable -ou encore mieux dans un méthodolo- afin d'être réutilisable?

Répondre

4

Je préfère ajouter ces clauses relatives à Prefetch dans un QuerySet personnalisé, puis accéder aux listes créées via les propriétés du modèle, si elles existent.

utilisation: Post.objects.filter(...).prefetch_comments()...

class PostQuerySet(models.QuerySet): 
    def prefetch_comments(self): 
     inner_qs = Comment.objects.order_by('-date') 
     return self.prefetch_related(Prefetch("comments", queryset=inner_qs, to_attr="comments_list")) 


class Post(models.Model): 
    .... 
    objects = PostQuerySet.as_manager() 

    @property 
    def most_recent_comment(self): 
     if hasattr(self, 'comments_list') and len(self.comments_list) > 0: 
      return self.comments_list[0] 
     return None 
+0

cette réponse a mis en place de nombreux chapitres de django, je vous remercie, dispersés dans mon esprit! Je vais essayer d'adopter sa philosophie et revenir à l'accepter. – raratiru