Django моделей - циркуляр-импорт-выпуск - PullRequest
1 голос
/ 30 марта 2020

My 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)

user / models.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)

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)

Сообщение об ошибке :

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'

Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 30 марта 2020

Лучше ссылаться на модели со строковыми литералами, чем ссылаться на них со ссылками на класс модели. 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(<b>'user.User'</b>, 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(<b>'sowi.Sowi'</b>, related_name="subscriptions", blank=True)
    memberships = models.ManyToManyField(<b>'sowi.Sowi'</b>, 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(<b>'user.User'</b>, on_delete=models.CASCADE)
    chat = models.OneToOneField(<b>'chat.Chat'</b>, blank=True, null=True, on_delete=models.CASCADE)

Еще лучше, когда вы ссылаетесь на модель пользователя [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(<b>settings.AUTH_USER_MODEL</b>, 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(<b>settings.AUTH_USER_MODEL</b>, on_delete=models.CASCADE)
    chat = models.OneToOneField('chat.Chat'
2 голосов
/ 30 марта 2020

try:

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)

Проблема с вашим кодом заключается в том, что вы импортируете Chat и Sowi в пользователя models.py, а затем пытаетесь импортировать пользователя models в Chat и Sowi. Вы видите круговой импорт там?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...