Utiliser la méthode get queryset () ou définir la variable queryset?

Ces deux morceaux de code sont identiques à la première vue:

class IndexView(generic.ListView):
    template_name = 'polls/index.html'
    context_object_name = 'latest_poll_list'
    queryset = Poll.active.order_by('-pub_date')[:5]

et

class IndexView(generic.ListView):
    template_name = 'polls/index.html'
    context_object_name = 'latest_poll_list'

    def get_queryset(self):
        return Poll.active.order_by('-pub_date')[:5]

quelle Est la différence entre eux? Et si c'est:

quelle approche est la meilleure? Ou lors de la configuration de queryset la variable est meilleure que le get_queryset méthode? Et vice-versa.

39
demandé sur 9Algorithm 2013-10-31 17:01:38

5 réponses

dans votre exemple,queryset et get_queryset avoir le même effet. Je voudrais légèrement favorable à la configuration de queryset parce que c'est moins verbeux.

Lorsque vous définissez queryset, le queryset est créé qu'une seule fois, lorsque vous démarrez votre serveur. D'autre part, le get_queryset la méthode est appelée pour chaque requête.

cela signifie Que get_queryset est utile si vous souhaitez ajuster la requête dynamiquement. Par exemple, vous pouvez retourner les objets qui appartiennent au courant utilisateur:

class IndexView(generic.ListView):
    def get_queryset(self):
        """Returns Polls that belong to the current user"""
        return Poll.active.filter(user=self.request.user).order_by('-pub_date')[:5]

un Autre exemple où get_queryset est utile lorsque vous souhaitez appliquer un filtre basé sur un callable, par exemple, de retour aujourd'hui les sondages:

class IndexView(generic.ListView):
    def get_queryset(self):
        """Returns Polls that were created today"""
        return Poll.active.filter(pub_date=date.today())

Si vous avez essayé de faire la même chose en paramètre queryset, puis date.today() ne serait appelé qu'une fois, lorsque la vue était chargée, et la vue afficherait des résultats incorrects après un certain temps.

class IndexView(generic.ListView):
    # don't do this!
    queryset = Poll.active.filter(pub_date=date.today())
57
répondu Alasdair 2015-04-21 09:43:02

D'autres réponses ont laissé passer une importante implication du fait que le queryset l'attribut est évalué au début du processus. Parce que vous ne créez pas seulement un queryset, vous êtes en fait découpage, la requête sera évalués à ce point. Cela signifie que vous n'obtiendrez que les 5 premiers sondages à ce moment-là, et ils ne se rafraîchiront pas, même si vous en créez un autre, jusqu'à ce que le processus soit relancé.

C'est exactement quand vous devriez être en utilisant get_queryset().

7
répondu Daniel Roseman 2013-10-31 17:41:43

l'attribut queryset est utilisé en interne, utilisez toujours la méthode (vous aurez souvent à effectuer des requêtes personnalisées basées sur request ou session vars par exemple)

4
répondu rj76 2013-10-31 13:28:09

Modèle et queryset sont très similaires, mais queryset de la valeur si la condition remplace celle du modèle.

Model est le type d'objet que cette vue affiche.

modifier Get_queryset contrôle quoi instances spécifiques cette vue affiche (ex: les 5 dernières instances créées)

à Partir de Django reinhardt, de la documentation:

modèle:

le modèle pour lequel cette vue affichera des données. En précisant modèle = Foo est effectivement identique à queryset = Foo.objet.tous les(), où objects représente le gestionnaire par défaut de Foo.

queryset:

un QuerySet qui représente les objets. Si elle est fournie, la valeur de queryset remplace la valeur fournie pour le modèle.

get_queryset:

get_queryset() Retourne le queryset qui sera utilisé pour récupérer l'objet qui ce point de vue s'affiche. Par défaut, get_queryset() renvoie la valeur de l'attribut queryset s'il est défini, sinon il construit un QuerySet en appelant la méthode all () sur le gestionnaire par défaut de l'attribut model.

1
répondu Bar Horing 2017-10-21 14:10:46

dans la classe juste inclure

Class MyViewSet(GenericAPIView):

    queryset = ''

si vous n'utilisez le queryset nulle part.

Cela a fonctionné pour moi.

Merci

0
répondu Shinto Joseph 2018-04-27 06:42:33