Django中如何解决两个模块相互导入

How to solve two module imports each other in Django

我有两个模型,分别命名为 User 和 Newspaper。用户可以是 author 或 reader,两者都在同一模型中。所以 Newspaper 有一个作者,它可以创造很多报纸。 Reader 有收藏夹,他可以添加任意数量的报纸。

问题:如何解决两个模块之间的循环导入?

额外信息: usernewspaper 是两个不同的应用程序。

├── project
│   ├── asgi.py
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── db.sqlite3
├── manage.py
├── newspaper
│   ├── admin.py
│   ├── apps.py
│   ├── __init__.py
│   ├── migrations
│   │   ├── 0001_initial.py
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
└── user
    ├── admin.py
    ├── apps.py
    ├── __init__.py
    ├── migrations
    │   ├── 0001_initial.py
    │   └── __init__.py
    ├── models.py
    ├── tests.py
    └── views.py

newspaper/models.py

class NewsPaper(models.Model):
    title = models.CharField(max_length=255)
    file = models.FileField(upload_to=get_file_upload_path)
    author = models.ForeignKey(get_user_model(), on_delete=models.CASCADE,
                                            related_name="created_newspaper")

    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title[:20] + '...' if len(self.title) > 20 else self.title

user/models.py

class User(AbstractBaseUser, PermissionsMixin):
    phone_number = models.CharField(max_length=20, unique=True,
                                    validators=[validate_phone_number])
    firstname = models.CharField(max_length=255)
    lastname = models.CharField(max_length=255)

    is_staff = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)

    favorites = models.ManyToManyField(NewsPaper)

    objects = UserManager()

    USERNAME_FIELD = 'phone_number'

    @property
    def my_uploaded_content(self):
        return self.created_newspaper.all()

    def __str__(self):
        return f'{self.firstname} {self.lastname}'

您可以通过这种方式使用 ForeignKey 而无需导入:

class User(AbstractBaseUser, PermissionsMixin):
    ...
    favorites = models.ManyToManyField('newspaper.NewsPaper')
    ...