Django / Python Круговая модель - PullRequest
15 голосов
/ 27 января 2011

Хорошо. Итак, я ПЫТАЮСЬ написать хороший организованный код и фактически создавать отдельные приложения django вместо того, чтобы объединять все в 1. Моя проблема в том, что у меня есть 3 приложения, каждое из которых ссылается на 1 другую модель из следующего приложения. В общем, у меня бесконечный цикл, приложение A должно знать о B.models.something1, приложение B должно знать о C.models.Somthing2, а приложение C должно знать о A.models.something3. Это, конечно, не сработает, для тех, кто интересуется, действительно ли это проблема :). Есть ли что-то похожее на объявление классов, так что python будет знать, что классы действительно существуют?

Спасибо.

РЕДАКТИРОВАТЬ: больше код: К сожалению, природа и модели моего проекта являются конфиденциальными, поэтому мне придется изменить имена, чтобы они отражали что-то совершенно другое, но код останется прежним.

Учитель / 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, в Расположение учителей. Файл "/Users/userzero/django/myapp/teacher/models.py", строка 2, в от student.models импорт Жалоба Файл "/Users/userzero/django/myapp/student/models.py", строка 3, в из школы school.models import Файл "/Users/userzero/django/myapp/casino/models.py", строка 2, в Расположение учителей. Ошибка импорта: невозможно импортировать имя Местоположение

1 Ответ

37 голосов
/ 27 января 2011

Из документов :

Для обозначения моделей, определенных в другом приложение, вы можете явно указать модель с полным ярлык приложения. Например, если Модель производителя выше определена в другое приложение под названием производство, вам нужно использовать:

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

Этот тип справки может быть полезен при разрешении кругового импорта зависимости между двумя приложениями.

Так что для ваших приложений попробуйте изменить, например,

 location = models.ForeignKey(Location) 

до

 location = models.ForeignKey('Location')

Обратите внимание, что если эта модель находится в другом приложении, вам нужно указать это тоже (спасибо @Bran за указание на это), например,

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