2011-01-27 16 views
15

Ok Así que estoy TRATANDO de escribir un buen código organizado y realmente hacer aplicaciones separadas de django en lugar de agrupar todo en 1. Mi problema es que tengo 3 aplicaciones que cada referencia hace referencia a otro modelo del próxima aplicación Así que, básicamente, tengo un bucle infinito, la aplicación A necesita saber acerca de B.models.something1, la aplicación B necesita saber acerca de C.models.Somthing2, y la aplicación C necesita saber acerca de A.models.something3. Esto, por supuesto, no se ejecutará, para aquellos que se preguntan si esto es realmente un problema :). ¿Hay algo que se asemeje a una predeclaración de clases, así que Python sabrá que las clases realmente existen?Django/Python Referencia de modelo circular

Gracias.

EDITAR: Más Código: Lamentablemente, la naturaleza y los modelos de mi proyecto son confidenciales, así que tendré que cambiar los nombres para reflejar algo completamente diferente, pero el código seguirá siendo el mismo.

maestro/models.py

from django.db import models 
from myapp.student.models import * 
from django.contrib.auth.models import User 
class Teacher(models.Model): 
    """(description)""" 
    user = models.ForeignKey(User) 
    name = models.CharField(max_length=100) 
    phone = models.CharField(max_length=13) 
    phone_ext = models.CharField(blank=True, max_length=5) 
    fax = models.CharField(blank=True, max_length=13) 
    fax_ext = models.CharField(blank=True, max_length=100) 
    url = models.URLField(blank=True, verify_exists=True) 
    complaint = models.ManyToManyField(Complaint) 
    city = models.CharField(blank=True, max_length=100) 
    state = models.CharField(blank=True, max_length=100) 
    postal_code = models.CharField(blank=True, max_length=15) 
    location = models.ManyToManyField(Location) 
    def __unicode__(self): 
     return self.name 
class Location(models.Model): 
    """(description)""" 
    city = models.CharField(blank=True, max_length=100) 
    state = models.CharField(blank=True, max_length=100) 
    country = models.CharField(blank=False, max_length=100) 
    def __unicode__(self): 
     return self.city + ", " + self.state +", "+self.country 

estudiante/models.py escuela

from django.db import models 
from django.contrib.auth.models import User 
from myapp.school.models import School 

class Student(models.Model): 
    """(Student description)""" 
    user = models.ForeignKey(User) 
    country = models.CharField(max_length=100) 
    state = models.CharField(max_length=100) 
    city = models.CharField(max_length=100) 
    locale = models.CharField(blank=False, max_length=5) 
    learningtype = models.CharField(blank=True, max_length=100) 
    sites = models.TextField(blank=True) 
    def __unicode__(self): 
     return str(self.user) 

class Complaint(models.Model): 
    """(Complaint description)""" 
    student = models.ForeignKey(Student) 
    site = models.ForeignKey(School) 
    complaint = models.TextField(blank=False) 
    def __unicode__(self): 
     return str(self.site) 

/models.py

from django.db import models 
from myapp.teacher.models import Location 
class School(models.Model): 
    """(School description)""" 
    name = models.CharField(max_length=100) 
    url = models.URLField(verify_exists=True) 
    img = models.ImageField(upload_to="casion_img/") 
    rating = models.FloatField() 
    description = models.CharField(blank=True, max_length=300) 
    goodstanding = models.BooleanField(default=True) 
    location = models.ForeignKey(Location) 
    def __unicode__(self): 
     return self.name 

Así que aquí es lo que estoy haciendo:

Archivo "/ Users/userzero/dj ango/myapp/school/models.py ", línea 2, en desde teacher.models import Ubicación Archivo" /Users/userzero/django/myapp/teacher/models.py ", línea 2, en desde student.models import Complaint Archivo "/Users/userzero/django/myapp/student/models.py", línea 3, en de school.models import School Archivo "/Users/userzero/django/myapp/casino/models.py" , línea 2, en de teacher.models importar la ubicación ImportError: no se puede importar nombre de la ubicación

+0

Los ciclos de importación no son necesariamente un problema. Pero sin más código no podemos descubrir qué es realmente. –

Respuesta

37

desde el docs:

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.

Así que para sus aplicaciones, por ejemplo, trate de cambiar

location = models.ForeignKey(Location) 

a

location = models.ForeignKey('Location') 

Tenga en cuenta que si este modelo se encuentra en una aplicación diferente, entonces es necesario especificar que también (gracias @Bran por señalar esto), por ejemplo,

location = models.ForeignKey('teacher.Location') 
+0

No conozco PyCheckMate, pero ... si tus aplicaciones de Django funcionan, y la solución es una técnica de Django documentada, entonces mi conjetura es que la falla está en PyCheckMate –

+0

Resulta que esto no funciona. Por qué Syncb funcionó aparentemente las aplicaciones se eliminaron de mi archivo de configuración de alguna manera (Teniendo en cuenta que no lo edité y que soy el único en el proyecto, tampoco tengo idea de cómo sucedió eso). – UserZer0

+0

¡Eso es un golpe! A partir de su descripción del problema, la cosa de la cuerda modelo debería funcionar. Si no es así, debe haber algo más en juego.¿Puedes intentar eliminar todo de dos de tus tres aplicaciones y volver a agregarlo poco a poco hasta que se produzca una excepción? ¿Sus mensajes de error dan alguna otra pista? Tuve errores como el suyo cuando intentaba registrar modelos en el sitio de administración (el administrador intentaba validar los modelos antes de que los modelos estuvieran listos para su validación). –

Cuestiones relacionadas