Python Django模型-循环导入问题

Python Django模型-循环导入问题,python,django,python-3.x,sqlite,django-models,Python,Django,Python 3.x,Sqlite,Django Models,我的Django项目使用三个应用程序,chat、user和sowi。每个应用程序的模型结构如下。我在启动服务器时出错,我想这是因为我有循环导入。如何解决此问题 chat/models.py from user.models import User class Chat(models.Model): name = models.CharField(max_length=100, default="private") class Message(models.Model): s

我的Django项目使用三个应用程序,
chat、user和sowi
。每个应用程序的模型结构如下。我在启动服务器时出错,我想这是因为我有循环导入。如何解决此问题

chat/models.py

from user.models import User

class Chat(models.Model):
    name = models.CharField(max_length=100, default="private")


class Message(models.Model):
    sender = models.ForeignKey(User, on_delete=models.CASCADE)
    receiver = models.ForeignKey(Chat, on_delete=models.CASCADE)
from chat.models import Chat
from sowi.models import Sowi

class User(AbstractUser):
    chats = models.ManyToManyField(Chat, blank=True)
    subscriptions = models.ManyToManyField(Sowi, related_name="subscriptions", blank=True)
    memberships = models.ManyToManyField(Sowi, related_name="memberships", blank=True)
    blocked = models.ManyToManyField("self", related_name="blocked", blank=True)
from chat.models import Chat, Message
from user.models import User

class Sowi(models.Model):
    owner = models.ForeignKey(User, on_delete=models.CASCADE)
    chat = models.OneToOneField(Chat, blank=True, null=True, on_delete=models.CASCADE)
用户/型号.py

from user.models import User

class Chat(models.Model):
    name = models.CharField(max_length=100, default="private")


class Message(models.Model):
    sender = models.ForeignKey(User, on_delete=models.CASCADE)
    receiver = models.ForeignKey(Chat, on_delete=models.CASCADE)
from chat.models import Chat
from sowi.models import Sowi

class User(AbstractUser):
    chats = models.ManyToManyField(Chat, blank=True)
    subscriptions = models.ManyToManyField(Sowi, related_name="subscriptions", blank=True)
    memberships = models.ManyToManyField(Sowi, related_name="memberships", blank=True)
    blocked = models.ManyToManyField("self", related_name="blocked", blank=True)
from chat.models import Chat, Message
from user.models import User

class Sowi(models.Model):
    owner = models.ForeignKey(User, on_delete=models.CASCADE)
    chat = models.OneToOneField(Chat, blank=True, null=True, on_delete=models.CASCADE)
sowi/models.py

from user.models import User

class Chat(models.Model):
    name = models.CharField(max_length=100, default="private")


class Message(models.Model):
    sender = models.ForeignKey(User, on_delete=models.CASCADE)
    receiver = models.ForeignKey(Chat, on_delete=models.CASCADE)
from chat.models import Chat
from sowi.models import Sowi

class User(AbstractUser):
    chats = models.ManyToManyField(Chat, blank=True)
    subscriptions = models.ManyToManyField(Sowi, related_name="subscriptions", blank=True)
    memberships = models.ManyToManyField(Sowi, related_name="memberships", blank=True)
    blocked = models.ManyToManyField("self", related_name="blocked", blank=True)
from chat.models import Chat, Message
from user.models import User

class Sowi(models.Model):
    owner = models.ForeignKey(User, on_delete=models.CASCADE)
    chat = models.OneToOneField(Chat, blank=True, null=True, on_delete=models.CASCADE)
错误消息

File "*/sowi/models.py", line 9, in <module>
    from chat.models import Chat, Message
  File "*/chat/models.py", line 4, in <module>
    from user.models import User
  File "*/user/models.py", line 5, in <module>
    from chat.models import Chat
ImportError: cannot import name 'Chat' from 'chat.models'
文件“*/sowi/models.py”,第9行,在
从chat.models导入聊天信息
文件“*/chat/models.py”,第4行,在
从user.models导入用户
文件“*/user/models.py”,第5行,在
从chat.models导入聊天
ImportError:无法从“Chat.models”导入名称“Chat”
提前谢谢

试试看:

class User(AbstractUser):
    chats = models.ManyToManyField('chat.Chat', blank=True)
    subscriptions = models.ManyToManyField('sowi.Sowi', related_name="subscriptions", blank=True)
    memberships = models.ManyToManyField('sowi.Sowi', related_name="memberships", blank=True)
    blocked = models.ManyToManyField("self", related_name="blocked", blank=True)

代码的问题是,您正在用户
models.py
中导入
Chat
Sowi
,然后尝试在
Chat
Sowi
中导入用户
models
。看到循环导入了吗?

使用字符串文本引用模型比使用模型类引用模型更好。Django可以处理此问题,并将自动解决这些问题:

# chat/models.py

from django.db import models

class Chat(models.Model):
    name = models.CharField(max_length=100, default="private")

class Message(models.Model):
    sender = models.ForeignKey('user.User', on_delete=models.CASCADE)
    receiver = models.ForeignKey(Chat, on_delete=models.CASCADE)

# user/models.py

from django.db import models

class User(AbstractUser):
    chats = models.ManyToManyField(Chat, blank=True)
    subscriptions = models.ManyToManyField('sowi.Sowi', related_name="subscriptions", blank=True)
    memberships = models.ManyToManyField('sowi.Sowi', related_name="memberships", blank=True)
    blocked = models.ManyToManyField("self", related_name="blocked", blank=True)

# sowi/models.py

from django.db import models

class Sowi(models.Model):
    owner = models.ForeignKey('user.User', on_delete=models.CASCADE)
    chat = models.OneToOneField('chat.Chat', blank=True, null=True, on_delete=models.CASCADE)

如果你能提供更多的上下文,这会有所帮助。您甚至没有在示例代码中的错误中表示该行。@eatmeimadanish您是对的,我添加了itThanks,它就像一个符咒。再一次,你救了我一个**。继续提供令人敬畏的帮助!为我节省了很多时间。谢谢