在不加载views / urls的情况下运行迁移

时间:2017-07-26 08:01:03

标签: django migration

我的一个观点中有以下代码:

@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

是否可以在不加载视图的情况下运行迁移,还是有更好的方法?

1 个答案:

答案 0 :(得分:1)

运行迁移会触发system checks运行,从而导致视图加载。没有选项可以禁用它。

看起来ratelimit库允许您传递可调用的内容。

@ratelimit(method='POST', rate=get_comment_rate)
def post_comment_ajax(request):

这将在视图运行时调用get_comment_rate,而不是在模块加载时调用def get_comment_rate(): try: ... except ProgrammingError: return '1/m' # or some other default 。这可能是一个优势(价值不会过时)或不利(每次运行视图时运行SQL查询都会影响性能。

通常,您希望在模块加载时避免数据库查询。除了导致迁移问题之外,它还可能在运行测试时导致问题 - 查询可以在创建test database之前转到实时数据库。

如果您对这种风险感到满意,可以选择在装饰器中捕获异常:

poky/<build_directory>/tmp/work/<machine_toolchain>/<package_name>/<package_version>/temp/log.task_order