为 Django ModelForm 实例指定数据库

Specify the database for a Django ModelForm instance

如何指定 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的外部用户67=] ModelForm.cleanModelForm.is_validModelForm.save

与我使用 QuerySet.using('foo') 的“using”挂钩的方式相同, 或 Model.save(using='foo').

  • 请注意,这是不是多数据库路由策略配置的作业。用例是我需要准确指定一个数据库,仅在 运行 时间已知。如果连接失败,它不应该回退到任何其他连接,所以数据库路由是钉子的错误锤子。

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

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

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

在为模型实例化 ModelForm 或调用其方法时,using='foo' 等价物是什么(ModelForm.cleanModelForm.save, 等等)?

除非有人可以找到使用 ModelForm 界面的方法来完成它,否则我只能得出结论 Django 没有提供 使用 ModelForm API 按原样。