Sar*_*ius 0 python sqlite django django-models python-3.x
我的 Django 项目使用三个应用程序,chat, user, 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)
Run Code Online (Sandbox Code Playgroud)
用户/模型.py
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)
Run Code Online (Sandbox Code Playgroud)
sowi/models.py
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)
Run Code Online (Sandbox Code Playgroud)
错误信息:
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'
Run Code Online (Sandbox Code Playgroud)
提前致谢!
最好使用字符串文字来引用模型,而不是通过对模型类的引用来引用模型。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)Run Code Online (Sandbox Code Playgroud)
更好的是,您引用用户模型 [Django-doc]来设置AUTH_USER_MODEL设置 [Django-doc],并使用此设置,这样如果您以后改变主意,可以更方便地更改此设置:
# chat/models.py
from django.conf import settings
from django.db import models
class Chat(models.Model):
name = models.CharField(max_length=100, default="private")
class Message(models.Model):
sender = models.ForeignKey(settings.AUTH_USER_MODEL, 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.conf import settings
from django.db import models
class Sowi(models.Model):
owner = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
chat = models.OneToOneField('chat.Chat'Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2865 次 |
| 最近记录: |