python - objects - ¿Cuándo debería usar un Administrador personalizado versus un QuerySet personalizado en Django?
objects.filter django (1)
Principalmente para permitir una composición fácil de las consultas. Generalmente, si desea poder realizar alguna operación en un conjunto de consulta existente en una cadena de llamadas de conjunto de consultas, puede usar un QuerySet
.
Por ejemplo, supongamos que tiene un modelo de Image
que tiene campos de width
y height
:
class Image(models.Model):
width = ... # Width in pixels
height = ... # Height in pixels
podrías escribir algunos métodos personalizados de QuerySet
:
class ImageQuerySet(models.QuerySet):
def landscapes(self):
return self.filter(width__gte=models.F(''height''))
def portraits(self):
return self.filter(width__lte=models.F(''height''))
def small(self):
return self.filter(width__lte=1200)
def large(self):
return self.filter(width__gte=1200)
class ImageManager(models.Manager):
def get_queryset(self):
return ImageQuerySet(self.model, using=self._db)
ahora puede crear fácilmente querysets dinámicos:
Image.objects.all().portraits().small()
Image.objects.all().large().portraits()
Lógicamente, estas funciones deberían preocuparse principalmente por la partición o la redefinición de los conjuntos de consulta existentes del modelo del conjunto de consultas. Para situaciones en las que no está operando en los conjuntos de consulta existentes, no desea devolver un conjunto de consulta, o puede que tenga que realizar alguna lógica relacionada que no involucre este modelo en particular, que un administrador de modelos que mejor se adapte.
En Django, los administradores personalizados son una excelente forma de organizar la lógica de consulta reutilizable. Los docs indican que hay dos razones por las que podría querer personalizar un Administrador: para agregar métodos adicionales de Administrador, y / o para modificar el QuerySet inicial que el Administrador devuelve.
Sin embargo, continúa describiendo cómo se pueden crear los QuerySets personalizados, y que estos se pueden hacer accesibles directamente desde el modelo de datos como administrador a través de QuerySet.as_manager()
. La instancia de Manager creada por QuerySet.as_manager () será prácticamente idéntica a PersonManager del ejemplo anterior.
Parece que hay mucha flexibilidad en cómo uno puede organizar su lógica entre Custom Manager y / o Custom QuerySets. ¿Puede alguien explicar los principios por los cuales debería decidir cuándo usar uno frente al otro?