django - queries - ¿Utiliza el método get_queryset() o establece la variable queryset?
orm django queries (5)
El atributo queryset se usa internamente, siempre use el método (a menudo tendrá que realizar consultas personalizadas según solicitud o valores de sesión, por ejemplo)
Estas dos piezas de código son idénticas en el primer rubor:
class IndexView(generic.ListView):
template_name = ''polls/index.html''
context_object_name = ''latest_poll_list''
queryset = Poll.active.order_by(''-pub_date'')[:5]
y
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]
¿Hay alguna diferencia entre ellos? Y si es:
¿Qué enfoque es mejor? ¿O al establecer la variable queryset
es mejor que anular el método get_queryset
? Y viceversa.
El modelo y el conjunto de preguntas son muy similares, pero el valor del conjunto de preguntas reemplazado es el del modelo.
El modelo es qué tipo de objeto muestra esta vista.
La anulación de get_queryset controla las instancias específicas que muestra esta vista (por ejemplo, las últimas 5 instancias creadas)
De la documentación de Django:
modelo:
El modelo para el que se mostrarán los datos en esta vista. Especificar modelo = Foo es efectivamente lo mismo que especificar queryset = Foo.objects.all () , donde los objetos representan el administrador predeterminado de Foo.
queryset:
Un QuerySet que representa los objetos. Si se proporciona, el valor de queryset reemplaza el valor proporcionado para el modelo .
get_queryset:
get_queryset () Devuelve el conjunto de consulta que se utilizará para recuperar el objeto que se mostrará en esta vista. De forma predeterminada, get_queryset () devuelve el valor del atributo queryset si está configurado, de lo contrario construye un QuerySet llamando al método all () en el administrador predeterminado del atributo del modelo.
En su ejemplo, queryset
y get_queryset
tienen el mismo efecto. Me gustaría favorecer un poco el ajuste de queryset
porque es menos detallado.
Cuando configura queryset
, el queryset se crea solo una vez, cuando inicia su servidor. Por otro lado, se get_queryset
método get_queryset
para cada solicitud.
Eso significa que get_queryset
es útil si quiere ajustar la consulta dinámicamente. Por ejemplo, puede devolver objetos que pertenecen al usuario actual:
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]
Otro ejemplo en el que get_queryset
es útil es cuando desea filtrar en función de un invocable, por ejemplo, devolver las encuestas de hoy:
class IndexView(generic.ListView):
def get_queryset(self):
"""Returns Polls that were created today"""
return Poll.active.filter(pub_date=date.today())
Si intentaba hacer lo mismo estableciendo queryset
, entonces date.today()
solo se llamaría una vez, cuando se cargara la vista, y la vista mostraría resultados incorrectos después de un tiempo.
class IndexView(generic.ListView):
# don''t do this!
queryset = Poll.active.filter(pub_date=date.today())
Otras respuestas han omitido una implicación importante del hecho de que el atributo queryset
se evalúa cuando se inicia el proceso. Como no solo está creando un conjunto de consulta, en realidad lo está cortando , la consulta se evaluará en ese punto. Eso significa que solo obtendrá los 5 primeros sondeos en ese momento, y no se actualizarán incluso si crea otro, hasta que se reinicie el proceso.
Esto es exactamente cuando debería usar get_queryset()
.
dentro de clase solo incluye
Class MyViewSet(GenericAPIView):
queryset = ''''
si no usa el conjunto de consulta en cualquier lugar.
Esto funcionó para mí.
Gracias