La herencia le permite reutilizar el código y crear modelos de datos más limpios. Pero Django ofrece más de una forma de heredar, así que asegúrese de conocer las diferencias.
La herencia de modelos es una característica ORM de Django que permite a los desarrolladores crear relaciones jerárquicas entre modelos de bases de datos. Permite la reutilización del código, la extensibilidad y una base de código más limpia al aprovechar los principios de la programación orientada a objetos.
Ya sea que esté creando una aplicación web compleja o trabajando en un proyecto más pequeño, la herencia de modelos puede ofrecer beneficios significativos, como reducir la redundancia y garantizar un comportamiento coherente.
Tipos de herencia de modelos en Django
Django ofrece soporte para tres tipos de herencia de modelos:
- Clases base abstractas.
- Herencia multitabla.
- Modelos proxy.
Cada uno de estos tipos de herencia de modelos tiene beneficios y los usará para fines específicos.
Clases base abstractas
Las clases base abstractas proporcionan una forma de definir campos y métodos comunes que pueden heredar varios modelos. Por ejemplo, si tiene dos modelos que comparten campos similares, puede usar una clase base abstracta para definir los campos similares. Echale un vistazo a éste ejemplo:
claseCliente(modelos. Modelo):
nombre = modelos. CharField (longitud_máxima=50)
correo electrónico = modelos. Campo de correo electrónico ()
customer_id = modelos. CampoEntero()
claseVendedor(modelos. Modelo):
nombre = modelos. CharField (longitud_máxima=50)
correo electrónico = modelos. Campo de correo electrónico ()
seller_id = modelos. CampoEntero()
El fragmento de código anterior define dos modelos de Django: Cliente y Vendedor. Estos modelos comparten dos campos comunes, a saber nombre y correo electrónico. Para evitar esta redundancia, puede crear un modelo separado para contener los campos comunes en el Cliente y Vendedor modelos y hacerlo abstracto.
claseInformación de usuario(modelos. Modelo):
nombre = modelos. CharField (longitud_máxima=50)
correo electrónico = modelos. Campo de correo electrónico ()
claseMeta:
abstracto = Verdadero
El fragmento de código anterior define un nuevo modelo y establece el abstracto atribuir a Verdadero. Esto significa que el modelo será abstracto y Django no creará una tabla en la base de datos.
Puedes reescribir el Cliente y Vendedor modelos como este:
claseCliente(Información de usuario):
customer_id = modelos. CampoEntero()
claseVendedor(Información de usuario):
seller_id = modelos. CampoEntero()
En el fragmento de código anterior, el Cliente y vendedores Los modelos heredan del Información de usuario modelo en lugar de modelos Modelo.
Puede ver sus modelos en el panel de administración registrándolos en su administrador.py archivo como este:
de .modelos importar Cliente, Vendedor
admin.site.register (Cliente)
admin.site.register (Vendedor)
Migre sus modos e inicie su servidor de desarrollo ejecutando lo siguiente en un línea de comando:
python manage.py hacer migraciones \
&& python administrar.py migrar \
&& python manage.py servidor de ejecución
Navegue a su sitio de administración e inicie sesión con sus datos de superusuario. Debería ver los tres campos para cada modelo.
En este ejemplo, Django ha creado una tabla para el Cliente y Vendedor modelos Puedes ver que el Información de usuario el modelo no tiene tabla ya que es abstracto.
Herencia de tablas múltiples
Puede usar la herencia de tablas múltiples cuando el modelo principal también debe existir como una tabla en la base de datos junto con el modelo secundario.
A diferencia de la herencia de clase base abstracta, donde el modelo principal no será una tabla en la base de datos, la herencia de varias tablas crea una tabla para el modelo principal.
En la herencia de tablas múltiples, el modelo secundario hereda todos los campos y métodos de su modelo principal y agrega sus campos específicos. Llaves extranjeras ayudar a establecer la relación modelo entre los modelos padre e hijo.
Aquí hay un ejemplo de herencia de varias tablas:
clasePersona(modelos. Modelo):
first_name = modelos. CharField (longitud_máxima=100)
last_name = modelos. CharField (longitud_máxima=100)definitivamenteobtener_nombre(ser):
devolverF"{self.first_name}{self.apellido}"claseMeta:
abstracto = VerdaderoclaseEmpleado(Persona):
empleado_id = modelos. CharField (longitud_máxima=20)
departamento = modelos. CharField (longitud_máxima=100)
salario = modelos. campo flotante ()
dob = modelos. campo de fecha ()
claseGerente(Empleado):
título = modelos. CharField (longitud_máxima=100)
Este fragmento de código define tres modelos. El primer modelo, llamado Persona, es abstracto. Define sólo el nombre y apellido de una persona.
El segundo modelo, llamado Empleado, hereda los campos de Persona pero define campos adicionales. El Empleado El modelo no es abstracto, por lo que tendrá su tabla en la base de datos.
El modelo final, llamado Gerente, hereda los campos de la Empleado modelo y agrega un campo llamado título.
La relación entre el Empleado y Gerente modelos se llama Herencia de tablas múltiples. Migra tus modelos, regístralos en administrador.py, inicie su servidor y navegue hasta el panel de administración. Deberías ver dos tablas creadas por Django.
Cuando intente agregar un nuevo administrador, notará que tiene todos los campos del Empleado modelo, así como su propio campo personalizado.
Modelos proxy
Un modelo proxy lo ayuda a crear un nuevo modelo que se extiende desde un modelo existente sin crear una nueva tabla de base de datos. En este tipo de herencia de modelos, los modelos proxy y original compartirán la misma tabla. Al usar modelos proxy, puede hacer cosas como crear modelos personalizados y cambiar administradores predeterminados.
Puede crear un modelo proxy agregando proxy=Verdadero en el Meta clase. Aquí hay un ejemplo:
claseProxyModel(Modelo base):
claseMeta:
apoderado = Verdadero
El uso típico de un modelo proxy es apropiado cuando existe un modelo base y existe la necesidad de crear una versión especializada del mismo con funcionalidad adicional. He aquí un ejemplo básico:
claseCorreo(modelos. Modelo):
título = modelos. CharField (longitud_máxima=30)
autor = modelos. CharField (longitud_máxima=30)definitivamente__str__(ser):
devolver titulo propioclaseProxyPost(Correo):
claseMeta:
apoderado = Verdadero
Este fragmento de código define dos modelos: Correo y Mi publicacion. El Correo El modelo define dos campos para el título y el autor. El ProxyPost modelo hereda del Correo modelo.
Migre los modelos anteriores y agregue una nueva publicación a la tabla creada para el Correo modelo.
Después de agregar la publicación, abra la Publicaciones de proxy mesa. Deberías encontrar la publicación que agregaste al Correo mesa en ella.
Los cambios que realice en las publicaciones en el Publicaciones de proxy afectará a la publicación correspondiente en el Correo mesa y viceversa. Esto prueba que realmente comparten la misma mesa.
Puedes modificar el calle() método del modelo proxy:
claseProxyPost(Correo):
claseMeta:
apoderado = Verdadero
ordenar = ["título"]
definitivamente__str__(ser):
devolver auto.autor
Con esta modificación, un ProxyPost La cadena de representación será su autor, no el título. El orden del modelo de proxy también será por el título en lugar del campo de ID predeterminado.
Cuando utilice modelos de proxy, debe tener en cuenta que no puede agregar campos personalizados a su modelo de proxy. El caso de uso principal de los modelos proxy es cuando desea que un modelo admita múltiples comportamientos.
Los modelos proxy lo ayudan a cambiar el comportamiento de un modelo existente sin modificar sus campos o la estructura de la tabla de la base de datos subyacente.
Utilice la herencia del modelo para la reutilización del código y la estructura organizativa
Al utilizar las diferentes técnicas de herencia de modelos, puede crear fácilmente código reutilizable y organizado para su proyecto.
La herencia de modelos evita el código redundante y mejora la capacidad de mantenimiento y la escalabilidad de su código. También facilita la navegación por su código, fomentando así una colaboración eficiente entre los equipos de desarrollo.
Además de la herencia de modelos, Django ofrece herencia de plantillas, que es una excelente manera de administrar y organizar plantillas para sus proyectos.