为Django ModelForm实例指定数据库

时间:2016-08-02 02:54:31

标签: django database-connection

如何指定Django ModelForm应该使用哪个数据库(通过别名)?

Django ModelForm知道其对应的模型和包含的字段。

ModelForm实例明确知道如何在内部指定数据库。它可以针对数据库验证其字段,并可以将新模型实例保存到数据库。这意味着它的操作知道要使用哪个数据库。

我无法在创建ModelForm时或在与数据库交互时找到如何指定除默认数据库之外的任何数据库::

import csv

from cumquat_app.forms import CumquatImportForm

db_alias = 'foo'

reader = csv.DictReader(input_file)
for row in reader:
    fields = make_fields_from_input_row(reader)

    # Wanted: ‘form = CumquatInputForm(fields, using=db_alias)’.
    form = CumquatImportForm(fields)

    # Wanted: ‘if form.is_valid(using=db_alias)’.
    if form.is_valid():

        # Wanted: ‘form.save(using=db_alias)’.
        form.save()

创建实例或调用 ModelForm时,我需要将数据库别名指定为ModelForm.clean的外部用户或ModelForm.is_validModelForm.save等。

我可以使用QuerySet.using('foo')的'using'钩子, 或Model.save(using='foo')

  • 请注意,是多数据库路由策略配置的作业。用例是我需要指定一个数据库,只在运行时才知道。如果连接失败,它不应该回到任何其他连接,因此数据库路由是错误的锤子。

  • 我可以request the ModelForm.save method to not commit its change(使用commit=False),然后直接使用Model.save。这并没有解决访问数据库的ModelForm的其他行为,因此它不是这个问题的解决方案。

  • 如果我使用它来创建模型实例,ModelManager.db_manager可以完成这项工作。但我依靠表单来创建实例;我无法创建模型实例,因为我还没有要分配的字段值。这是表格的工作。

  • 如果重要:这是在管理命令中,我需要能够 从命令行指定特定数据库别名是 命令的上下文。

为模型实例化using='foo'或调用其方法(ModelFormModelForm.clean等时,ModelForm.save等效项是什么? 。)?

1 个答案:

答案 0 :(得分:1)

除非有人可以使用ModelForm界面找到按照要求执行此操作的方法,否则我只能使用ModelForm API来结束 Django无法执行此操作它代表着。