django - 如何解决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}'
解决方案
您可以通过这种方式使用 ForeignKey 而无需导入:
class User(AbstractBaseUser, PermissionsMixin):
...
favorites = models.ManyToManyField('newspaper.NewsPaper')
...
推荐阅读
- uitableview - 圆形图像视图最初在 UITableViewCell 中加载为正方形 - Xamarin.iOS
- c# - NSwag CodeGen Net Core 中的数据注释
- azure - 从本地 VM 迁移到 Azure 云?
- python - TypeError:启动 django runserver 时,'function' 类型的参数不可迭代
- c - 使用 fscanf 和 fprintf 实现复制功能
- workbox - 如何在 workbox-config.js 中为 POST 操作配置 runtimeCaching
- html - 输入类型号不更新输入值
- javascript - 如何在工具提示中显示图像?
- f# - 如何在 Visual Studio Code 中启用 F# Interactive?
- sparql - 使用光学 API (MarkLogic) 进行地理空间查询