Столкновение с проблемой циклического импорта

У меня есть два приложения (front и lrnadmin) в проекте (portal) это мой корневой каталог

enter image description here

Проблема в том, что когда я импортирую модели друг в друга, это дает мне ошибку. В этой модели я хочу использовать квалификацию в качестве внешнего ключа, поэтому я хочу импортировать квалификацию из lrnadmin.models this is my front.models.py

from datetime import datetime, timezone
from django.db import models
from django.db.models import expressions
from django.db.models.base import Model
from django.utils import timezone

from lrnadmin.models import Qualification

class Staff(models.Model):
    """Model definition for Staff."""
    # TODO: Define fields here
    nStaff = models.CharField(max_length= 50)
    role = models.CharField(max_length= 50)
    lrnQ = models.ForeignKey(Qualification, on_delete= models.CASCADE)
    relQ = models.CharField(max_length=200)
    relE = models.CharField(max_length=200)
    # Cv = models.CharField(max_length=100, blank=True, null=True)
    # Doc = models.CharField(max_length=100, blank=True, null=True)
    sec7 = models.ForeignKey(Sec7, on_delete=models.CASCADE)
    class Meta:
        """Meta definition for Staff."""

        verbose_name = 'Staff'
        verbose_name_plural = 'Staffs'

    # def __str__(self):
    #     """Unicode representation of Staff."""
    #     pass

и в этой модели я хочу User как внешний ключ, поэтому я хочу import User из front.models this is my lrnadmin.models.py

from django.contrib.auth.models import AbstractUser
from django.db import models
from django.utils import timezone
from front.models import User

class CentreCode(models.Model):
    """Model definition for CentreCode."""

    # TODO: Define fields here
    user = models.ForeignKey(User, on_delete= models.CASCADE)
    centreCode = models.CharField(max_length= 20)
    categories = models.CharField(max_length = 20)
    authorisation = models.CharField(max_length= 20)
    registrationType = models.CharField(max_length= 20)

    class Meta:
        """Meta definition for CentreCode."""

        verbose_name = 'CentreCode'
        verbose_name_plural = 'CentreCodes'

    # def __str__(self):
    #     """Unicode representation of CentreCode."""
    #     pass

Как я могу справиться с этим

File "E:\lrn\portal\lrnadmin\models.py", line 4, in <module>
    from front.models import User
  File "E:\lrn\portal\front\models.py", line 7, in <module>
    from lrnadmin.models import Qualification
ImportError: cannot import name 'Qualification' from partially initialized module 'lrnadmin.models' (most likely due to a circular import) (E:\lrn\portal\lrnadmin\models.py)

вы можете попробовать get_model, который позволит избежать импорта модели во время выполнения

   from django.apps import apps
   qualification_model = app.get_model('lrnadmin', 'Qualification')

ИЛИ

вы можете попробовать импортировать модель внутри функции вместо импорта на уровне модуля

Вы можете "лениво загрузить" модель, используя строковый литерал, как описано в docs, поэтому, например, для front модели приложения User вы можете определить ее следующим образом:

# Remove from front.models import User


class CentreCode(models.Model):
    # ...
    user = models.ForeignKey('front.User', on_delete= models.CASCADE)
    # ...

Если вы определили front.models.User как пользовательскую модель, настоятельно рекомендуется просто ссылаться на пользовательскую модель, используя settings.AUTH_USER_MODEL, как описано here:

from django.conf import settings
# Remove from front.models import User


class CentreCode(models.Model):
    # ...
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete= models.CASCADE)
    # ...
Вернуться на верх