Как вы используете ManyToManyFields между приложениями без циклического импорта? - PullRequest
1 голос
/ 30 марта 2020

У меня есть два приложения: пользователи и сообщения , с моделями CustomUser и Block в пользователях и моделью Post в сообщениях. Я хотел бы создать поле «Закладки» для пользователя ManyToMany, чтобы они могли добавлять в закладки любые сообщения, которые они хотят. Это выглядело бы примерно так:

class CustomUser(AbstractUser):
    ...
    neighbors = models.ManyToManyField("CustomUser", blank=True)
    blocks = models.ManyToManyField("Block", blank=True)
    bookmarked = models.ManyToManyField("Post", blank=True)
    ...

Как видите, у меня уже есть несколько полей ManyToMany, но все они были для моделей из одного приложения пользователи . Что касается моего класса Post:

class Post(models.Model):
    ...
    author = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
    block = models.ForeignKey(Block, null=True, on_delete=models.SET_NULL)
    ...

Я уже импортировал две модели из приложения users , CustomUser и Block, в приложение posts . Я понимаю, что, импортируя Post в users models.py, он создает циклический импорт, по крайней мере, он дает мне следующую ошибку:

ImportError: cannot import name 'CustomUser' from partially initialized module 'users.models' (most likely due to a circular import)

Есть ли способ предотвратить это? Я знаю, что можно просто создать атрибут закладки в модели Post, а не в модели User, но я не хочу этого делать просто потому, что лично мне это немного странно. Известны ли вам какие-либо другие варианты, или мне придется создавать атрибут «Закладка» в «Пост», а не «Пользователь»?

1 Ответ

1 голос
/ 30 марта 2020

Вы можете связать отношение FK, используя строку как

author = models.ForeignKey(<b>'app_name.CustomUser'</b>, on_delete=models.CASCADE)

, чтобы вам не пришлось импортировать связанную модель

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