【问题标题】:Use a specific database with a ModelForm使用带有 ModelForm 的特定数据库
【发布时间】:2016-06-10 05:56:48
【问题描述】:

ModelForm 保存数据时如何指定要使用的数据库?

multiple-database support in Django 意味着我可以定义更多的数据库,而不仅仅是default。例如:

# settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': ':memory:',
    },
    },
    'staging': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'HOST': 'db.example.com',
        # …
    },
}

这允许模型管理器查询与默认数据库不同的数据库:

from django import models

class Foo(models.Model):
    # …

queryset = Foo.objects.using('staging').all()

ModelForm 子类也与数据库交互:

from django import forms

from .models import Foo

class FooImportForm(forms.ModelForm):
    class Meta:
        model = Foo
        fields = [
            # …
        ]

fields = {
    # …
}
form = FooImportForm(fields)
form.save()

当我form.save() 时,如何指定FooModelForm 实例应该使用staging 数据库?我看不到指定 using('staging') 等效项的地方。

【问题讨论】:

    标签: django django-models django-forms


    【解决方案1】:

    先不提交任何形式,然后现在您获取模型对象并将其保存using

    f = form.save(commit=False)
    f.save(using='staging')
    

    【讨论】:

      【解决方案2】:

      Model.save method接受using参数指定数据库:

      foo = Foo(fields)
      foo.save(using='staging')
      

      ModelForm.save method 返回Model 实例:

      foo_form = FooImportForm(fields)
      foo = foo_form.save()
      

      ModelForm.save 方法可以选择性地被告知不要提交:

      foo_form.save(commit=False)
      

      把它们放在一起:

      foo_form = FooImportForm(fields)
      foo = foo_form.save(commit=False)
      foo.save(using='staging')
      

      【讨论】:

        猜你喜欢
        • 2012-12-29
        • 2021-05-02
        • 2011-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-19
        • 2012-06-05
        • 2017-10-28
        相关资源
        最近更新 更多