2011-07-24 13 views
5

Tengo una situación en la que estoy modelando un partido de fútbol, ​​y cada partido tiene un conjunto de eventos relacionados que se relacionan con lo que sucedió durante el juego. Así que algo un poco como esto:Django: consultar una clase base abstracta

class Event(models.Model): 
    time = models.IntegerField() 
    class Meta: 
     abstract = True 

class Goal(Event): 
    scorer = models.ForeignKey('Player') 

class PitchInvasion(Event): 
    number_of_people = models.IntegerField() 

class FootballMatch(models.Model): 
    events = models.ForeignKey('Event') 

Perdona el ejemplo descabellada, pero que está ahí para demostrar que estas subclases de Event podrían ser cualquier cosa. Lo que quiero hacer es poder consultar todos esos eventos y ordenarlos a tiempo, para dar una visión cronológica de lo que sucedió en ese partido.

Sin embargo, con abstract = True, los objetos Event terminar con un pitchinvasion_set, goal_set y así sucesivamente,. ¿Esto se resolvería configurando abstract = False y usando herencia concreta? He leído que hacer esto es a bad idea, as it introduces an extra join.

¿Cuál es la mejor manera de manejar situaciones como esta?

+0

La herencia de clase de modelo Django (real o abstracta) es * no * herencia verdadera en el sentido de Python. Es más una opción de conveniencia que otra cosa. Tuve que lidiar con algo similar hace un año y nunca encontré una solución satisfactoria. –

Respuesta

2

Estoy de acuerdo con el comentario de Peter Rowell: la herencia del modelo no es lo que piensas que es, y en mi opinión es muy rara vez útil.

Una forma mucho mejor de acercarse a esto es con generic relations. Por lo tanto, tendría un modelo Match, con un events = GenericRelation(), y cada uno de los tipos de eventos tiene un GenericForeignKey de nuevo para coincidir. Luego puede hacer match.events.all() y obtener todos los eventos por separado para esa coincidencia.

Si lo desea, aún puede usar la herencia abstracta para la clase base para los eventos, si todos comparten algunos campos como la descripción y la hora.

+0

Gracias Daniel, esto suena exactamente a lo que estoy buscando. ¿Sabes si es posible administrar todas las relaciones genéricas para un objeto en una sola lista dentro del administrador? Supongo que no es posible. –

Cuestiones relacionadas