2009-01-06 22 views
12

Estoy trabajando en una aplicación Django que contiene un modelo Offer. Una instancia Offer contiene las condiciones de fijación de precios y señala una definición de producto. El modelo del producto es en realidad una jerarquía (tengo un modelo Television, un modelo Camcorder, etc.). Así que me gustaría que el modelo Offer contenga una asociación polimórfica (o "genérica") para apuntar a cualquier producto.¿Cómo puedo definir una relación polimórfica entre modelos en Django?

Por ahora, todo lo que he encontrado es esto para usar el generic associations in the ContentTypes application. Esto podría funcionar, pero estoy buscando alternativas, si las hay.

Gracias por su ayuda.

(una solución por respuesta por favor)

Respuesta

-3

Es posible que desee echar un vistazo a model inheritance.

+0

Obviamente, estoy de acuerdo, pero ¿podría explicar la respuesta para que sea realmente útil para alguien que lo estaría pidiendo? De esa manera puedo +1. – Ivan

+0

Gracias, pero no creo que esta sea la respuesta. Lo que necesito es tener algo como: clase Oferta (models.Model): product = models.ForeignKey (Producto) ... Donde Producto es una clase abstracta, y el objeto al que se hace referencia es una instancia de un concreto subclase. Alguna idea? – MiniQuark

3

Si solo necesita apuntar a "cualquier producto", no a ningún modelo, la solución es tener un modelo de Producto del que todos los productos hereden (es decir, Televisión y Videocámara son ambas subclases de Producto) y otorgar su Oferta modelar una ForeignKey para el Producto.

+1

Sí, esta es la idea general, pero si solo hago eso, entonces tengo 2 inconvenientes: en primer lugar, no puedo usar la herencia de varias tablas, en segundo lugar, cuando paso de una oferta a un producto, obtengo una instancia de Producto en lugar de una instancia de videocámara (u otra clase concreta). – MiniQuark

+1

Puede transformar automáticamente una instancia de Producto en una instancia de Videocámara (por ejemplo) si almacena un FK en ContentType (Videocámara) "hijo" en el momento de la creación. Más discusión en http://groups.google.com/group/django-users/browse_thread/thread/f4241bc16455f92d/7268c3f7bca6b046?lnk=raot –

+0

¿Qué quiere decir con "No puedo usar la herencia de tablas múltiples"? La herencia de múltiples tablas es la forma en que Django implementa la herencia de las clases base no abstractas (a diferencia de Rails, que tiene herencia de tabla única). Sus elecciones aquí son herencia o relaciones genéricas; no hay otra bala de plata –

4

ContentTypes es el enfoque correcto. Esto se debe a que ForignKey solo puede apuntar a un tipo de tabla, por lo que debe pasar por una tabla intermedia y dividir según el tipo.

Por lo tanto, herencia del modelo para la jerarquía de clases, pero ContentType para las claves externas.

1

Eche un vistazo a django-polymorphic, esto implementa esta característica y también utiliza ContentTypes internamente.

Cuestiones relacionadas