Django:链接不同应用程序中的模型会产生循环导入错误



我的项目名称中有两个应用程序quiz_app_tacher和accounts这些文件中的许多模型都是相互连接的,但当我尝试迁移时,我会收到这个错误

文件"F: \self\quiz_site\quiz_app_tacher\models.py";,第2行,在从帐户将模型导入为account_models File";F: \self\quiz_site\accounts\models.py";,第13行,in类学生(模型.模型):文件;F: \self\quiz_site\accounts\models.py";,第15行,学生测验=模型。ManyToManyField(quiz_models.quiz)属性错误:部分初始化的模块'quiz_app_tacher.models'没有属性"测验"(很可能是由于循环导入)

quiz_app_tacher/models.py

from django.utils import timezone 
from accounts import models as account_models
from django.db import models
# Create your models here.
ANSWER_CHOICES = (
('A', 'A'),
('B', 'B'),
('C','C'),
('D','D'),
)
class Quiz(models.Model):
#https://www.sankalpjonna.com/learn-django/the-right-way-to-use-a-manytomanyfield-in-django
name=models.CharField(max_length=250)
quiz_id = models.CharField(max_length=300,)
created_date = models.DateTimeField(default=timezone.now)
author = models.ForeignKey(account_models.User, on_delete=models.CASCADE,related_name='quizzes')
#Using related_names Author.quizzes.all()
#will list all the quizzes which are made by that author.
course = models.ForeignKey(account_models.Course, on_delete=models.CASCADE, related_name='quizzes')
def save(self, *args, **kwargs):
#override default save method to do something before saving object of model
if not self.quiz_id:
self.quiz_id = self.name+"-"+self.created_date.strftime("%M%S")  #TODO:Edit this 
super(Quiz, self).save(*args, **kwargs)
def __str__(self):
return self.name 
class result(models.Model):
#quiz=models.OneToOneField(Quiz,on_delete=models.CASCADE)
student=models.ForeignKey(account_models.Student , on_delete=models.CASCADE,related_name='my_results')#maybe use account_models.User
quiz=models.ForeignKey(Quiz, on_delete=models.CASCADE, related_name='results')
points=models.IntegerField()
def __str__(self):
return  f"Student name: { str(self.student)} Points:{ str(self.points)}"

class Question(models.Model):
quiz = models.ForeignKey(Quiz, on_delete=models.CASCADE, related_name='questions')
#quiz=models.ForeignKey(Quiz, on_delete=models.CASCADE)
question=models.CharField(max_length=300,)
A = models.CharField(max_length=200,)
B = models.CharField(max_length=200,)
C = models.CharField(max_length=200,)
D = models.CharField(max_length=200,)
answer = models.CharField(max_length=200,choices=ANSWER_CHOICES,default='A')
question_number=models.IntegerField()
def __str__(self):
return self.question

账户/模型.py

from django.contrib.auth.models import AbstractUser
from django.db import models
import quiz_app_teacher.models as quiz_models
# Create your models here.
class Course(models.Model):
name = models.CharField(max_length=30)
Year=models.IntegerField()
def __str__(self):
return self.name
class User(AbstractUser):
is_teacher = models.BooleanField(default=False)
class Student(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
quizzes = models.ManyToManyField(quiz_models.Quiz)
course  = models.ForeignKey(Course,on_delete=models.CASCADE, related_name='class_students')
def __str__(self):
return self.user.username
class Teacher(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
quizzes = models.ManyToManyField(quiz_models.Quiz)
def __str__(self):
return self.user.username

如果我尝试使用定义关系

quizzes = models.ManyToManyField(to='quiz_models.Quiz')

SystemCheckError:系统检查发现一些问题:

错误:帐户。学生测验:(fields.E300)字段定义与未安装的模型"quiz_models.quiz"的关系,或者是抽象的。账户学生。测验:(领域。E307)领域账户Student.quicks的声明中懒惰地引用了'quiz_models.quizz',但未安装应用程序'quiz_models'。账户Student_questions.quick:(字段.E307)字段账户Student_quicks.quiz声明时懒惰地引用了quiz_models.quizz',但未安装应用程序'quiz_models'。

您可以删除导入并引用ForeignKey模型,如下所示:

models.ForeignKey('account_models.Course', ...)

这应该允许您在没有循环导入的情况下运行迁移

https://docs.djangoproject.com/en/4.0/ref/models/fields/#django.db.models.ForeignKey

从OP编辑:

更新:我通过同时对两个文件运行迁移来修复它。python manage.py makemigrations帐户quiz_app_tacher