Проблема с отношением "многие ко многим": модель не найдена в приложении: "не была установлена".

Это мой первый пост на 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

Вернуться на верх