在不加载视图/URL 的情况下运行迁移



我的一个视图中有以下代码:

@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 

最新更新