with tutorial para latest framework español desde cero applications python django django-models single-table-inheritance

python - tutorial - latest django



Herencia de tabla única en Django (5)

¿Existe un apoyo explícito para la herencia de tabla única en Django? La última vez que escuché, la función aún estaba en desarrollo y debate.

¿Hay bibliotecas / hacks que pueda usar mientras tanto para capturar el comportamiento básico? Tengo una jerarquía que mezcla diferentes objetos. El ejemplo canónico de una estructura de corporación con una clase Employee, subclases para tipos de empleados y un manager_id (parent_id) sería una buena aproximación del problema que estoy resolviendo.

En mi caso, me gustaría representar la idea de que un empleado puede administrar a otros empleados mientras es administrado por un empleado diferente. No hay clases separadas para Manager y Worker, lo que hace que sea difícil distribuirlas entre las tablas. Las sub-clases representarían tipos de empleados-programadores, contadores, vendedores, etc. y serían independientes de quién supervisa quién (OK, supongo que ya no es una corporación típica en algún aspecto).


Actualmente hay dos formas de herencia en Django: MTI (herencia de tablas modelo) y ABC (clases base abstractas).

Escribí un tutorial sobre lo que sucede bajo el capó.

También puede hacer referencia a los documentos oficiales sobre la herencia del modelo .


Ver mi intento:

http://djangosnippets.org/snippets/2408/

Una emulación de "tabla por jerarquía", también conocida como "herencia de tabla única" en Django. La clase base debe contener todos los campos. No se permite que las subclases contengan ningún campo adicional y, de manera óptima, deben ser proxies.

No es exactamente "herencia de tabla única", pero lo suficientemente cerca para muchas situaciones.


Creo que puedes hacer algo similar a esto.

Tengo que implementar una solución para este problema yo mismo, y así fue como lo resolví:

class Citrus(models.Model) how_acidic = models.PositiveIntegerField(max_value=100) skin_color = models.CharField() type = models.CharField() class TangeloManager(models.Manager) def get_query_set(self): return super(TangeloManager, self).get_query_set().filter(type=''Tangelo'') class Tangelo(models.Model) how_acidic = models.PositiveIntegerField(max_value=100) skin_color = models.CharField() type = models.CharField() objects = TangeloManager() class Meta: # ''appname'' below is going to vary with the name of your app db_table = u''appname_citrus''

Esto puede tener algunos problemas de bloqueo ... No estoy muy seguro de cómo Django maneja eso de la parte superior de mi cabeza. Además, realmente no probé el código anterior, es estrictamente para fines de entretenimiento, con la esperanza de ponerlo en el camino correcto.


esto podría ser útil: https://github.com/craigds/django-typed-models Parece ser una especie de implementación de herencia de tabla única, pero tiene la limitación de que las subclases no pueden tener ningún campo adicional.

También hay un fork que aborda el problema de no poder crear campos adicionales: https://github.com/KrzysiekJ/django-typed-models

actualización: creo que el tenedor puede haberse fusionado de nuevo

Aquí hay una discusión reciente sobre la lista de correo de desarrolladores de django sobre STI: https://groups.google.com/forum/#!msg/django-developers/-UOM8HNUnxg/6k34kopzerEJ


Creo que OP está preguntando sobre la herencia de tabla única como se define aquí :

Las bases de datos relacionales no son compatibles con la herencia, por lo que cuando se hace una asignación de objetos a bases de datos, debemos considerar cómo representar nuestras estructuras de herencia agradables en tablas relacionales. Al mapear a una base de datos relacional, tratamos de minimizar las uniones que pueden aumentar rápidamente al procesar una estructura de herencia en múltiples tablas. La herencia de tabla única mapea todos los campos de todas las clases de una estructura de herencia en una sola tabla.

Es decir, una tabla de base de datos única para toda una jerarquía de clases de entidad. Django no es compatible con ese tipo de herencia.