La primera de ellas es herencia esencialmente modelo, porque eso es lo que utiliza la aplicación de MTI de Django (excepto que es un OneToOneField
en lugar de un ForeignKey
, pero eso es simplemente una ForeignKey
que es único).
Cada vez que tenga una relación es-a (es decir,, un restaurante es un lugar), se trata de herencia, por lo que el camino a seguir es utilizar una de las metodologías de herencia modelo de Django. Cada uno, sin embargo, tiene sus pros y contras:
modelos abstractos
modelos abstractos son útiles cuando lo que desea es sin carga campos y/o métodos repetitivos. Se usan mejor como mixins, más que como verdaderos "padres". Por ejemplo, todos estos modelos tendrán una dirección, por lo que la creación de un modelo abstracto Address
y tener cada herencia de eso podría ser una cosa útil. Pero, un Restaurant
no es un Address
, per se, por lo que esta no es una verdadera relación padre-hijo.
MTI (Herencia de tablas múltiple)
Este es el uno que es similar a su primera opción anterior. Esto es más útil cuando necesita interactuar con las clases padre e hijo y los hijos tienen campos únicos propios (campos, no métodos). Entonces, un Restaurant
podría tener un campo cuisine
, pero un Place
no lo necesitaría. Sin embargo, ambos tienen una dirección, por lo que Restaurant
hereda y se genera a partir de Place
.
modelos sustitutos
modelos sustitutos son como alias. No pueden tener sus propios campos, solo obtienen los campos de los padres. Sin embargo, pueden tener sus propios métodos, por lo que son útiles cuando necesita diferenciar tipos de la misma cosa. Por ejemplo, podría crear modelos proxy como StaffUser
y NormalUser
desde User
. Todavía hay una sola tabla de usuarios, pero ahora puedo agregar métodos únicos para cada uno, crear dos vistas administrativas diferentes, etc.
Para su escenario, los modelos proxy no tienen mucho sentido. Los hijos son intrínsecamente más complicados que los padres y no tendría sentido almacenar todos los campos como cuisine
para Restaurant
en Place
.
Usted podría utilizar un modelo abstracto Place
, pero entonces se pierde la capacidad para ponerse a trabajar Place
por sí sola. Cuando desee una clave externa para un "lugar" generalizado, deberá usar claves externas genéricas, en su lugar, para poder elegir entre los diferentes tipos de lugares, y eso agrega mucha sobrecarga, si no es necesario.
Su mejor apuesta es usar la herencia normal: MTI. A continuación, puede crear una clave externa al Place
y agregar cualquier elemento secundario de Place
.
Necesita decirnos más sobre lo que está haciendo con estos objetos y clases antes de poder ayudarlo. – Marcin
Bueno, si le das un vistazo, solo quería preguntar qué método de implementación es el preferido y en qué lugar? esto es más una cuestión arquitectónica. – whatf
La pregunta "arquitectónica" no puede responderse en abstracto. – Marcin