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

Django 在不加载视图/URL的情况下运行迁移,django,migration,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

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

@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(method='POST', rate=get_comment_rate)
def post_comment_ajax(request):
这将在视图运行时调用
get\u comment\u rate
,而不是在模块加载时调用。这可能是优点(值不会过时)也可能是缺点(每次运行视图时运行SQL查询可能会影响性能)

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

如果您对这种风险没有意见,一种选择是在decorator中捕获异常:

def get_comment_rate():
    try:
        ...
    except ProgrammingError:
        return '1/m'  # or some other default 

注释掉,然后取消注释对不起,这对其他开发人员来说没有意义,也没有为这个添加一个
if
子句。谢谢,我最后做了第二次包装,特别是为ratelimit decorator,效果很好!