Administradores de modelos integrados y personalizados en Django

El administrador de Django es una clase que actúa como una interfaz a través de la cual los modelos de Django interactúan con las bases de datos. Cada modelo tiene al menos un objeto administrador. Tiene muchos métodos, atributos para facilitar el trabajo con bases de datos. De hecho, muchos desarrolladores de Django de nivel principiante no saben que usan el objeto de la clase Manager para extraer o crear el objeto u objetos modelo deseados. El objeto Administrador predeterminado que proporciona Django en los modelos es » objetos «.

Sintaxis:

Para usar el objeto de administrador predeterminado de Django, debe seguir la siguiente sintaxis: 

model_name.objects.method

Aquí «objetos» es el objeto administrador que Django crea por defecto.

Un ejemplo básico:

Digamos que tenemos una clase modelo llamada Hospital :

class Hospital(models.Model):
    name = models.CharField(max_length=50)
    city = models.CharField(max_length=30)
    def __str__(self):
        return self.name

Pero aún no creó ningún objeto en la base de datos. Solo crea una mesa vacía con la estructura de objetos de hospital. Para crear estos objetos en la base de datos, necesitamos usar nuestro objeto de administrador de Django predeterminado (ya que no tenemos que crear ningún administrador personalizado):

Hospital.objects.create(name='AIIMS',city ='Delhi')

El método ‘crear’ crea un nuevo objeto. Toma valores de campo que la clase modelo quiere. En la línea de código anterior, creamos un objeto de hospital llamando al método ‘crear’ que toma valores de campo como argumento.

Dar un nombre personalizado al administrador predeterminado:

A veces es necesario dar un nombre personalizado al administrador predeterminado. Para ello hay que definir un atributo de clase o campo de tipo models.Manager(). Aquí hay un ejemplo –

class Student(models.Model):
    ...
    students = models.Manager() //now the default manager is named as students

Después de esto, toda la operación en la tabla de la base de datos de estudiantes debe realizarse utilizando el administrador de «estudiantes»: 

Student.students.filter(...) // here students manager is used

Cualquier esfuerzo de usar «objetos» como administrador de esta clase conducirá a dar un error.

Métodos de la clase Manager:

Los objetos del administrador tienen muchos métodos integrados para facilitar las operaciones en la base de datos. Algunos de los métodos más populares se describen aquí: 

todos() devuelve un conjunto de consultas que contiene todos los objetos creados hasta el momento 
filtro(**kwargs) devuelve un conjunto de consultas que contiene una lista de objetos que coinciden con los argumentos dados. Si no se encuentra ningún objeto coincidente, devuelve un conjunto de consultas vacío. 
excluir (** kwargs) hace exactamente lo contrario del método filter(), es decir, devuelve un conjunto de consultas que contiene objetos que no coinciden con los argumentos dados.
obtener (**kwargs) devuelve un solo objeto que coincide con el argumento dado. Si se encuentran varios objetos, arrojará un error Model.MultipleObjectsReturned. Si get() no encuentra ningún objeto, genera una excepción Model.DoesNotExist. 
crear(**kwargs) crear un nuevo objeto con argumentos dados.
order_by(*campos) establece el orden del conjunto de consultas devuelto anteriormente de acuerdo con los argumentos pasados ​​en él.

Ejemplo :

El siguiente ejemplo utiliza el shell de comandos de python. 

>>> h1 = Hospital.objects.create(name="Calcutta Medical",city="kolkata")
>>> h2 = Hospital.objects.create(name="dummy",city="Chennai")     #creating objects using create() and save all these new objects into database
>>> h3 = Hospital.objects.create(name="TATA cancer Hospital",city="Mumbai")
>>> h4 = Hospital.objects.create(name="AIIMS Delhi",city="Delhi")
>>> h5 = Hospital.objects.create(name='NRS hospital",city="kolkata")
...
>>> Hospital.objects.filter(city='kolkata')  # returns queryset of objects whose city attribute is 'kolkata'
<QuerySet [<Hospital: Calcutta Medical>, <Hospital: NRS hospital>]>
>>> Hospital.objects.get(city='Delhi')
<Hospital: AIIMS Delhi>
>>> Hospital.objects.get(city='kolkata') # raise error as there are multiple objects

Estos son los métodos más populares. Sin embargo, el número de tales métodos es enorme. Puede consultar la documentación de django para obtener una referencia completa.

Creación de administradores personalizados:

A veces, es posible que desee que el administrador de django funcione de cierta manera que el administrador predeterminado no. En ese caso, puede crear sus propios administradores personalizados. El procedimiento es fácil. Tienes que crear una clase que herede de la clase Manager. Aquí hay un ejemplo – 

Ejemplo :

Hablemos del modelo de Hospital. Estamos creando un administrador personalizado llamado CustomManager que es similar al administrador de django predeterminado, excepto por una cosa. Cuando llamamos al método all() del objeto CustomManager, no obtendremos todos los objetos. En su lugar obtendremos todos aquellos objetos que tengan city = ‘kolkata’ – 

Python3

class CustomManager(models.Manager):
  '''first we get all objects from the database by
  calling the get_queryset method of the inherited class
  i.e. Manager class using super().get_queryset().
  After that we are filtering objects having city attribute equal to kolkata
  and return the filtered objects'''
  get_queryset(self):
    return super().get_queryset().filter(city= 'kolkata')

Cada clase de administrador tiene un método get_queryset. Se utiliza para obtener un conjunto de consultas de objetos en función de las propiedades que toma como argumentos. Si no se proporciona ningún argumento, devolverá todos los objetos. En este ejemplo, creamos un administrador de django personalizado al heredar la clase Manager y anular solo el método get_queryset. 

Así que hemos definido un administrador personalizado. Ahora todo lo que tenemos que hacer es vincular este administrador con el modelo del Hospital: 

Python3

class Hospital(models.Model):
  name = models.CharField(max_length=50)
  city = models.CharField(max_length=30)
  objects = models.Manager() # our default django manager
  kolkata_hospitals = CustomManager() # creating our custom manager object
  def __str__(self):
    return self.name

El modelo de hospital tiene dos objetos de administrador. Ahora, si llamamos a Hospital.objects.all() , obtenemos todos los objetos del hospital. Pero cuando llamemos a Hospital.kolkata_hospitals.all() obtendremos solo aquellos objetos cuya ciudad sea kolkata.

Tenga en cuenta que si está utilizando varios objetos de administrador en el mismo modelo, debe tener cuidado con el orden de los objetos de administrador definidos. El primer objeto administrador definido se tratará como un objeto administrador predeterminado. Por ejemplo: en el ejemplo anterior, «objetos» es el administrador predeterminado, ya que se define primero. Django usa administradores predeterminados en algún proceso interno. Por lo tanto, tenga cuidado al elegir su administrador predeterminado o puede obtener algunos resultados inesperados. Si desea que un administrador sea predeterminado y ese objeto de administrador no se define primero, puede definirlo como administrador predeterminado configurando default_manager_name de la clase Meta igual a ese nombre de objeto.

class Hospital(models.Models):
    ...
    class Meta:
        default_manager_name = 'kolkata_hospitals' # default manager is now kolkata_hospitals not objects

Puede hacer lo que quiera con los administradores personalizados. Puede definir un nuevo método para modificar algunos datos en la base de datos o devolver algo. No es necesario que cada método de administrador devuelva un conjunto de consultas. De hecho, puede definir métodos que no devuelvan nada. 

Si desea obtener más información, consulte la documentación oficial de Django sobre el administrador: https://docs.djangoproject.com/en/3.0/topics/db/managers/

Publicación traducida automáticamente

Artículo escrito por riter79 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *