Проблема с отношением "многие ко многим": модель не найдена в приложении: "не была установлена".
Это мой первый пост на stackoverflow. Дайте мне знать, если я могу улучшить свой пост.
Я попытался перезапустить старый проект. Архитектура состоит из 2 приложений:
- блог
- аутентификация
blog.models содержит :
class BlogContributor(models.Model): contributor = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) blog = models.ForeignKey(Blog, on_delete=models.CASCADE) contribution = models.CharField(max_length=255, blank=True)
class Meta:
unique_together = ("contributor", "blog")
authentication.models :
class User(AbstractUser): CREATOR = "CREATOR" АБОНЕНТ = "АБОНЕНТ"
ROLE_CHOICES = (
(CREATOR, "Créateur"),
(SUBSCRIBER, "Abonné"),
)
profile_photo = models.ImageField(verbose_name="photo de profil")
role = models.CharField(max_length=30, choices=ROLE_CHOICES, verbose_name="rôle")
follows = models.ManyToManyField(
"self",
limit_choices_to={"role": CREATOR},
symmetrical=False,
verbose_name="suit",
)
blogs = models.ManyToManyField(
"self",
through="BlogContributor",
related_name="contributors",
)
Возникает проблема : authentication.User.blogs: (fields.E331) Поле задает отношение "многие-ко-многим" через модель 'BlogContributor', которая не была установлена.
Я пытался :
- to import BlogContributor in the file
- to import BlogContributor in authentication init.py
Когда я выполняю последнее действие, возникает другая проблема : raise AppRegistryNotReady("Приложения еще не загружены.") django.core.exceptions.AppRegistryNotReady: Apps are not loaded yet.
Может быть, вы не добавили ваше приложение для блога в INSTALLED_APPS в файле settings.py?
В определении поля blogs
в вашей модели User
есть две ошибки. Я считаю, что вам следует заменить его на :
blogs = models.ManyToManyField(
Blog,
through="blog.BlogContributor",
related_name="contributors",
)
Используйте "self"
, когда вам нужно создать отношение "многие ко многим" с одинаковыми моделями (например, можно представить поле followers
на модели User
)
Из документации :
Чтобы сослаться на модели, определенные в другом приложении, вы можете явно указать модель с полной меткой приложения.
Поэтому я добавил blog.
перед BlogContributor