python - 从 python Django 中的导入模块导入当前模块(导入循环)
问题描述
以下面的伪代码为例
models.py
from django.db import models
from django.core.exceptions import ValidationError
from .methods import list_eligible_badges
class User(models.Model):
handle = models.SlugField(max_length=200)
class Permission(models.Model):
user = models.ForeignKey(User)
badge = models.SlugField(max_length=200)
def clean(self):
super(Permission, self).clean()
allowed_badges = list_eligible_badges()
try:
allowed_badges.index(self.badge)
except:
raise ValidationError('This user is not eligible for this privilege')
methods.py
from .models import User
def list_eligible_badges(user_handle):
user_in_context = User.objects.get(handle=user_handle)
# do some validation on the user_in_context to figure out what
# badge is this user eligible for then return a list of badges
# allowed for this user
上面的代码定义了两个相关的数据模型,User
其中Permission
每个权限都与一个用户相关联。在文件中,methods.py
我们有一个方法,list_eligible_badges
该方法采用 user_handle(用户的唯一 slug 标识符)并返回该特定用户有资格获得的权限的 slug 列表。
然后在模型list_eligible_badges
的 clean 函数中使用该方法Permission
来验证每个权限,然后再将其添加到数据库中。
一切似乎都很好,除了运行代码时,它显示错误:
文件“methods.py”,第 1 行,在
从 .models 导入用户
ImportError:无法从“.models”导入名称“用户”
即使methods.py
从任何其他模块导入时它没有显示此错误models.py
看起来这会创建某种导入循环!作为两个文件,models.py
并methods.py
相互导入。不幸的是,我必须在list_eligible_badges
外部定义该方法,因为它将被多个其他模块重用,并且如果不导入User
数据模型我就无法定义它。
那么我该如何处理呢?python 中有没有类似 PHP 的 require_once 的东西?
解决方案
您可以做的一件事是在本地导入:
class Permission(models.Model):
user = models.ForeignKey(User)
badge = models.SlugField(max_length=200)
def clean(self):
from .methods import list_eligible_badges
super(Permission, self).clean()
allowed_badges = list_eligible_badges()
推荐阅读
- django - Django - 表单模板为 Imagefield 抛出“此字段是必需的”
- python - 从 R 获取 Python 脚本时出现错误 1033
- javascript - 是否可以从 tronweb 和 Azure 密钥库触发 Tron 智能合约
- mysql - MySQL Select Where Unexpected Results
- c# - C# ASN.1 解码失败
- typescript - 如何在打字稿中创建一个类并动态添加字段?
- javascript - 如何通过 node-rdkafka 传递多个 groupid 和主题对来消费?
- php - Laravel 新增存储日志权限
- javascript - 将中国 MS Azure 认知服务与全球 WEB 服务相结合
- python - 在熊猫中将行转换为正确的数据框