Pregunta ¿Cuándo debería usar un Administrador personalizado versus un QuerySet personalizado en Django?


En Django, los administradores personalizados son una excelente forma de organizar la lógica de consulta reutilizable. los documentos Establece eso, afirma eso Hay dos razones por las que puede 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 del 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?


32
2018-04-22 12:49


origen


Respuestas:


Principalmente para permitir una composición fácil de las consultas. En general, 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 tienes un Image modelo que tiene una width, height campos:

class Image(models.Model):
    width = ...  # Width in pixels
    height = ... # Height in pixels

podrías escribir alguna costumbre QuerySet métodos:

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.


18
2018-04-22 13:05