2009-12-28 12 views
8

Digamos que tengo dos aplicaciones Django:Django: ¿Hay alguna manera de tener el modelo "directo" en ManyToManyField en una aplicación diferente del modelo que contiene ManyToManyField?

  • competiciones - que se encargará de datos de la competición
  • entradas - que se encargará de la funcionalidad relacionada con los competidores que entran en competiciones

En el aplicación de competiciones Tengo un modelo que representa una sección de una competencia:

class Division(models.Model): 
    competition = models.ForeignKey(Competition) 
    discipline = models.CharField(max_length=1, choices=DISCIPLINE_CHOICES) 
    age_group = models.ForeignKey(AgeGroup) 
    participants = models.ManyToManyField(Competitor, through='Entry') 

quiero poner el modelo de entrada en la aplicación de las entradas:

class Entry(models.Model): 
    division = models.ForeignKey('Division') 
    competitor = models.ForeignKey(Competitor) 
    withdrawn = models.BooleanField(default=False) 

¿Cómo resuelvo el de importación ... ... declaraciones, para que funcionen? Cuando pongo en las declaraciones de importación como from entries.models import Entry consigo los modelos de estas aplicaciones ignoradas por syncdb (porque las importaciones son circulares) o cuando se quita uno o ambos de ellos se producen errores de validación:

Error: One or more models did not validate: entries.entry: 'division' has a relation with model Division, which has either not been installed or is abstract. competitions.division: 'participants' specifies an m2m relation through model Entry, which has not been installed

entiendo por qué esto sucede, pero no tengo idea de cómo cambiar esto, para que funcione (sin recurrir a mover el modelo Entry a la aplicación de competiciones, lo que realmente no quiero hacer).

+0

puede publicar la clase 'Competitor' – czarchaic

Respuesta

16

Parece que he encontrado una respuesta, que funciona de manera más consistente :)

El Django documentation on the ForeignKey class dice :

To refer to models defined in another application, you can explicitly specify a model with the full application label. For example, if the Manufacturer model above is defined in another application called production, you'd need to use:

class Car(models.Model): 
    manufacturer = models.ForeignKey('production.Manufacturer') 

This sort of reference can be useful when resolving circular import dependencies between two applications.

5

veces, django.db.models.get_model ayuda a evitar las importaciones circulares. En su ejemplo, tratar de importar Entry normalmente y chage la definición division FK en Entry a esto:

from django.db.models import get_model 

class Entry(models.Model): 
    division = models.ForeignKey(get_model('competitions', 'Division')) 
+0

Por lo que puedo ver, esto no siempre funciona ... Supongo que depende del orden en que django carga las aplicaciones o algo así. Todavía - consejo muy útil, gracias :) –

+0

de ahí el "a veces";) –

+0

ooops, mi mal;) –

Cuestiones relacionadas