【问题标题】:Specify the database for a Django ModelForm instance为 Django ModelForm 实例指定数据库
【发布时间】:2016-08-02 02:54:30
【问题描述】:

我如何指定 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.cleanModelForm.is_valid时将数据库别名指定为ModelForm的外部用户或ModelForm.save

我可以使用 QuerySet.using('foo') 的“使用”钩子同样的方式, 或Model.save(using='foo')

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

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

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

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

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

【问题讨论】:

    标签: django database-connection


    【解决方案1】:

    除非有人可以使用ModelForm 接口按照要求找到一种方法,否则我只能得出结论Django 无法使用ModelForm API 来做到这一点

    【讨论】:

      猜你喜欢
      • 2013-04-09
      • 1970-01-01
      • 1970-01-01
      • 2015-04-24
      • 1970-01-01
      • 2014-12-01
      • 1970-01-01
      • 2018-07-07
      相关资源
      最近更新 更多