首页 > 解决方案 > 如何解决Django中两个模块相互导入的问题

问题描述

我有两个名为 User 和 Newspaper 的模型。用户可以是作者或读者,并且两者都在同一模型中。所以报纸有一个作者,它可以创建许多报纸。读者有收藏夹,他可以添加任意数量的报纸。

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

额外信息: user并且newspaper是两个不同的应用程序。

├── 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

报纸/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

用户/模型.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}'

标签: djangodjango-orm

解决方案


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

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

推荐阅读