2016-07-27 6 views
0

Bei Verwendung klassenbasierter generischer Sichten in Django bedeutet das Attribut queryset, dass die Objektgruppe, auf die die Ansicht angewendet wird, "eingeschränkt" wird, richtig?Django: versuchen, zu verstehen, wie das Attribut querieset in klassenbasierten generischen Ansichten funktioniert

Wenn queryset angegeben wird, wird dieses queryset als Quelle von Objekten verwendet. (Django's get_object())

Modell:

from django.db import models 

class Person(models.Model): 
    full_name = models.CharField(max_length=30) 
    is_active = False 

Ausblick:

from django.views.generic import DetailView 
from books.models import Person 

class PersonDetail(DetailView): 
    queryset = Person.objects.filter(is_active=True) 

Die queryset oben stellt sicher, dass Objekte nur zu prüfen, mit is_active=true.

Aber wie funktioniert das intern?

Zum Beispiel: Fügt Django eine SQL-Bedingung AND is_active=TRUE an jede Abfrage in der Ansicht?

Ok das letzte Beispiel scheint ziemlich dumm, aber ich hoffe, Sie bekommen die Idee von meiner Frage. Vielen Dank.

+1

"* Fügt Django eine SQL-Bedingung AND is_active = TRUE zu jeder Abfrage in der Ansicht *". Ja genau. Dann wendet es [zusätzliche Filter an, um auf ein bestimmtes Objekt einzugrenzen] (https://github.com/django/django/blob/master/django/views/generic/detail.py#L38). – solarissmoke

+0

@solarissmoke danke für deinen Kommentar. Wenn du eine Antwort formulierst, werde ich es gerne annehmen :) – gglasses

Antwort

2

Ja, genau das passiert. Ihr Abfrage-Set wird von der Methode get_object der View als Basis-Abfrage-Set verwendet. Es gilt dann ein additional filter ein bestimmtes Objekt zu erhalten (zB durch ID):

queryset = queryset.filter(pk=pk) 

Natürlich ist die Ansicht, die ein einzelnes Objekt braucht, kein queryset, so dass es dann tut:

obj = queryset.get() 

Welches gibt entweder ein einzelnes Objekt oder eine DoesNotExist oder MultipleObjectsReturned Ausnahme zurück. DoesNotExist führt zu einem 404. MultipleObjectsReturned ist unbehandelt und wird an Ihren Code weitergegeben.

Verwandte Themen