如何解决Django中两个模块相互导入的问题。

问题描述 投票:1回答:1

我有两个模型,分别命名为用户和报纸。用户可以是作者,也可以是读者,两者在同一个模型中。报纸有一个作者,它可以创建许多报纸,读者有一个收藏夹,他可以添加任意多的报纸。读者有一个收藏夹,他可以添加任何他想要的报纸。

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

额外的信息。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

newsapermodels.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

usermodels.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}'
django django-orm
1个回答
2
投票

你可以使用ForeignKey而不导入这种方式。

class User(AbstractBaseUser, PermissionsMixin):
    ...
    favorites = models.ManyToManyField('newspaper.NewsPaper')
    ...
© www.soinside.com 2019 - 2024. All rights reserved.