Ссылка на круговую модель Django/Python
Ok Итак, я пытаюсь написать хороший организованный код и фактически создавать отдельные приложения django, а не комбинировать все вместе в 1. Моя проблема в том, что у меня есть 3 приложения, каждая из которых ссылается на одну другую модель из следующего приложения. Таким образом, в основном у меня бесконечный цикл, App A нужно знать о B.models.something1, App B должен знать о C.models.Somthing2, а App C должен знать об A.models.something3. Это, конечно, не сработает, для тех, кто задается вопросом, действительно ли это проблема:). Есть ли что-то похожее на предварительное определение классов, поэтому python будет знать, что классы действительно существуют?
Спасибо.
EDIT: Больше Код:
К сожалению, характер и модели моего проекта являются конфиденциальными, поэтому мне придется изменить имена, чтобы они отражали нечто совершенно иное, но код останется прежним.
Учитель/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
студент/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)
школа/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
Итак, вот что я получаю:
Файл "/Users/userzero/django/myapp/school/models.py", строка 2, в from teacher.models import Местоположение Файл "/Users/userzero/django/myapp/teacher/models.py", строка 2, в от student.models import Жалоба Файл "/Users/userzero/django/myapp/student/models.py", строка 3, в от школы .models import School Файл "/Users/userzero/django/myapp/casino/models.py", строка 2, в from teacher.models import Местоположение
ImportError: невозможно импортировать имя Местоположение
Ответы
Ответ 1
Из docs:
Обращаться к моделям, определенным в другом приложения, вы можете явно указать модель с полным ярлык приложения. Например, если Модель производителя выше определена в другое приложение, называемое производством, вам нужно будет использовать:
class Car(models.Model):
manufacturer = models.ForeignKey('production.Manufacturer')
Эта ссылка может быть полезна при разрешении кругового импорта зависимостей между двумя приложениями.
Итак, для ваших приложений, попробуйте изменить, например.
location = models.ForeignKey(Location)
to
location = models.ForeignKey('Location')
Обратите внимание, что если эта модель находится в другом приложении, вам также нужно указать это (спасибо @Bran за указание этого), например
location = models.ForeignKey('teacher.Location')