2013-01-12 17 views
12

Nur Verwenden kam über diese in der django docsDjango: Wenn QuerySet Keine

Aufruf keine() eine queryset erstellen, die nie irgendwelche Objekte zurückgibt und keine Abfrage ausgeführt wird, wenn die Ergebnisse zugreifen. Ein qs.none() queryset ist eine Instanz von EmptyQuerySet.

Ich baue eine Menge CRUD-Apps (Überraschung) und ich kann mir keine Situation vorstellen, in der ich none() verwenden müsste.

Warum sollte man ein EmptyQuerySet zurückgeben?

Antwort

11

Normalerweise in Fällen, in denen Sie eine QuerySet bereitstellen müssen, aber es gibt keine zu bieten - wie zum Beispiel eine Methode aufrufen oder zu einer Vorlage geben.

Der Vorteil ist, wenn Sie wissen, es wird kein Ergebnis sein (oder nicht wollen, um ein Ergebnis), und Sie müssen noch ein, none() wird die Datenbank nicht getroffen.

Für ein nicht-realistisches Beispiel, sagen Sie, Sie haben eine API, wo Sie Ihre Berechtigungen abfragen können. Wenn das Konto nicht bestätigt wurde, da Sie bereits die Account Objekt und sehen Sie, dass account.is_activated ist False, können Sie die Datenbank für die Berechtigungen Überprüfung überspringen, indem nur Permission.objects.none() mit

+0

Ich glaube, das ist richtig, aber ich werde in werfen, dass es wie die einige der Kern-Entwickler sind in Unterstützung scheint die None() Verfahrens zum Entfernen. Bitte siehe Ticket Django Support Ticket 19184 https://code.djangoproject.com/ticket/19184 –

+1

Die dort angegebenen Gründe sind alle gültig, aber sie sind eine Kritik an der Umsetzung, nicht das Muster. – DanielB

+0

Ich würde dir nicht widersprechen ... nur eine Beobachtung über das aktuelle Feature hinzufügen. –

4

In Fällen, in denen Sie querysets anhängen möchten sondern will eine leeren mit ähnlich Bedingungen beginnen, wo wir eine leere Liste instanziiert mit zu beginnen, aber nach und nach sinnvollen Werten, um es Beispiel zu halten anhängen ..

def get_me_queryset(conditionA, conditionB, conditionC): 
    queryset = Model.objects.none() 

    if conditionA: 
     queryset |= some_complex_computation(conditionA) 
    elif conditionB: 
     queryset |= some_complex_computation(conditionB) 

    if conditionC: 
     queryset |= some_simple_computation(conditionC) 

    return queryset 

get_me_queryset sollte fast immer zurückkehrt Instanz django.db .models.query.QuerySet (weil gute prog Rammen) und nicht None oder [], sonst bringt es später Kopfschmerzen. . Auf diese Weise bleibt Ihr Code auch dann intakt, wenn keine der Bedingungen erfüllt ist. Keine weitere Typüberprüfung

0

Eine andere Verwendung von queryset.none ist, wenn Sie nicht wissen, ob es Objekte gibt, aber nicht einen Fehler auslösen möchten.

Beispiel:

class DummyMixin(object): 

    def get_context_data(self,**kwargs): 
     """ Return all the pks of objects into the context """ 

     context = super(DummyMixin, self).get_context_data(**kwargs) 

     objects_pks = context.get(
      "object_list", 
      Mymodel.objects.none() 
     ).values_list("pk", flat=True) 

     context["objects_pks"] = objects_pks