tutorial - Referencia de modelo circular de Django/Python
models django unique (1)
Ok, trato de escribir un buen código organizado y de crear aplicaciones django separadas en lugar de agrupar todo en 1. Mi problema es que tengo 3 aplicaciones que hacen referencia a 1 modelo diferente de la siguiente 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?
Gracias.
EDITAR: Más Código: desafortunadamente 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.
profesor / 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
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)
escuela / 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 esto es lo que obtendré:
Archive "/Users/userzero/django/myapp/school/models.py", línea 2, en from teacher.models import Location File "/Users/userzero/django/myapp/teacher/models.py", línea 2, en de student.models import Complaint File "/Users/userzero/django/myapp/student/models.py", línea 3, de school.models import School File "/Users/userzero/django/myapp/casino/models.py ", línea 2, desde teacher.models import Location ImportError: no se puede importar el nombre Location
De los documentos :
Para hacer referencia a los modelos definidos en otra aplicación, puede especificar explícitamente un modelo con la etiqueta de la aplicación completa. Por ejemplo, si el modelo del fabricante anterior se define en otra aplicación llamada producción, necesitaría usar:
class Car(models.Model):
manufacturer = models.ForeignKey(''production.Manufacturer'')
Este tipo de referencia puede ser útil al resolver dependencias circulares de importación entre dos aplicaciones.
Entonces, para sus aplicaciones, intente cambiar, por ejemplo
location = models.ForeignKey(Location)
a
location = models.ForeignKey(''Location'')
Tenga en cuenta que si este modelo está en una aplicación diferente, debe especificarlo también (gracias @Bran para señalar esto), por ej.
location = models.ForeignKey(''teacher.Location'')