Pregunta

¿Hay soporte explícito para la herencia de una sola tabla en Django? Lo último que escuché es que la característica aún estaba en desarrollo y debate.

¿Hay bibliotecas / hacks que puedo usar mientras tanto para capturar el comportamiento básico? Tengo una jerarquía que mezcla diferentes objetos. El ejemplo canónico de una estructura corporativa con una clase de empleado, 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 está siendo administrado por un empleado diferente. No hay clases separadas para Manager y Worker, lo que hace que sea difícil de distribuir entre las tablas. Las subclases representarían tipos de empleados: programadores, contadores, ventas, etc. y serían independientes de quién supervisa a quién (OK, supongo que ya no es una corporación típica en cierto sentido).

¿Fue útil?

Solución

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

Escribí un tutorial sobre lo que está pasando debajo del capó.

También puede consultar los documentos oficiales en herencia de modelo .

Otros consejos

Creo que el OP está preguntando acerca de la Herencia de una sola tabla como definido aquí :

  

Las bases de datos relacionales no admiten la herencia, por lo tanto, cuando se asignan objetos a bases de datos, debemos considerar cómo representar nuestras estructuras de herencia en las tablas relacionales. Al asignar a una base de datos relacional, intentamos minimizar las uniones que pueden acumularse rápidamente al procesar una estructura de herencia en varias tablas. La herencia de una sola tabla asigna todos los campos de todas las clases de una estructura de herencia en una sola tabla.

Es decir, una única tabla de base de datos para una jerarquía completa de clases de entidad. Django no admite ese tipo de herencia.

Mira mi intento:

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

  

Una emulación de " tabla por jerarquía " a.k.a. " herencia de tabla única " en Django. La clase base debe contener todos los campos. No se permite que las subclases contengan campos adicionales y, de manera óptima, deberían ser proxies.

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

Creo que puedes hacer algo parecido a esto.

Yo mismo tengo que implementar una solución para este problema, 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 realmente seguro de cómo django maneja eso desde lo alto de mi cabeza. Además, realmente no probé el código anterior, es estrictamente con fines de entretenimiento, para ponerte en el camino correcto.

esto podría ser útil: https://github.com/craigds/django-typed- modelos Parece ser algo así como una implementación de la herencia de una sola tabla, pero tiene la limitación de que las subclases no pueden tener campos adicionales.

también hay una bifurcación que resuelve el problema de no poder crear campos adicionales: https://github.com/KrzysiekJ/django-typed-models

actualización: creo que la bifurcación se pudo haber vuelto a combinar en

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top