我的一个视图中有以下代码:
@ratelimit(method='POST', rate=get_comment_rate())
def post_comment_ajax(request):
...
但是,在初始./manage.py migrate
时,get_comment_rate(( 需要在数据库中有一个表,所以我无法运行迁移来创建表。我最终遇到了以下错误:
Django.db.utils.ProgrammingError: relation .. does not exist
是否可以在不加载视图的情况下运行迁移,或者有更好的方法?
运行迁移会触发系统检查运行,从而导致视图加载。没有禁用此功能的选项。
看起来ratelimit
库允许您传递可调用对象。
@ratelimit(method='POST', rate=get_comment_rate)
def post_comment_ajax(request):
这将在视图运行时调用get_comment_rate
,而不是在模块加载时调用。这可能是优点(值不会过时(或缺点(每次运行视图时运行 SQL 查询可能会影响性能(。
通常,您希望在加载模块时避免数据库查询。除了导致迁移问题外,它还可能导致运行测试时出现问题 - 查询可以在创建测试数据库之前转到实时数据库。
如果您可以接受这种风险,一种选择是在装饰器中捕获异常:
def get_comment_rate():
try:
...
except ProgrammingError:
return '1/m' # or some other default