【问题标题】:save() got an unexpected keyword argument 'using'save() 得到了一个意外的关键字参数“使用”
【发布时间】:2014-03-23 20:29:15
【问题描述】:

我正在为我的 django 项目使用多数据库系统。

但是当我试图保存我的表单时,我收到了这个错误:save() got an unexpected keyword argument 'using'

这是我的简单代码:

我的观点:

def addCompany2(request):
"""Add a company"""

    selectedObject = CompanyDataset()

if request.method == 'POST':
    formCompany2 = CompanyForm2(request.POST, instance=selectedObject)
    selectedObject = formCompany2.save(using='dataset')
else:
    formCompany2 = CompanyForm2(instance=selectedObject)

return render_to_response('company/addCompany2.html', {'referer': referer, 'formCompany2': formCompany2}, context_instance=RequestContext(request))

我的模特

class CompanyDataset(models.Model):
    name = models.CharField(max_length=255, blank=True)
    ....
    ...
    ...

    def __unicode__(self):
        return self.name

    class Meta:
        db_table = 'company_dataset'
        managed = True

我的表格:

class CompanyForm2(ModelForm):

    class Meta:
        model = CompanyDataset
        #exclude = ('website')

    def __init__(self, *args, **kwargs):
        super(CompanyForm2, self).__init__(*args, **kwargs)

        self.fields.keyOrder = [
            'nom',
            'country'
            ]

设置本地

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'XXXXX',
        'USER': 'XXXXX',
        'PASSWORD': 'XXXXX',
        'HOST': '127.0.0.1',
        'PORT': '',
    },
    'dataset': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'XXXXX',
        'USER': 'XXXXX',
        'PASSWORD': 'XXXXX',
        'HOST': '127.0.0.1',
        'PORT': '5432',
    }
}

参考文档:https://docs.djangoproject.com/en/1.6/topics/db/multi-db/我不明白为什么它不起作用?我可能做错了什么,但我找不到。

我的 django 版本是:1.6.2

提前感谢您的帮助。 :)

【问题讨论】:

    标签: python django multi-database


    【解决方案1】:

    using= 关键字参数位于模型 save() 方法上,而不是 ModelForm 保存方法上。你应该这样做:

    ...
    
    if request.method == 'POST':
        formCompany2 = CompanyForm2(request.POST, instance=selectedObject)
        selectedObject = formCompany2.save(commit=False)
        selectedObject.save(using='dataset')
    
    ...
    

    【讨论】:

    • 您好 ACGray 感谢您的回答,但我遇到了与丹尼尔相同的问题:我有一个错误,比如我没有取消 "using='dataset' => (1146, "Table ' myproject.company_dataset' 不存在")
    • 该表是否存在于您的“数据集”数据库中? ./manage.py syncdb 不带参数仅在“默认”数据库上运行。您可以使用./manage.py syncdb --database=dataset 将所有模型安装到另一个数据库中。如果要限制哪些模型在哪些数据库中可用,则需要编写数据库路由方案。见docs.djangoproject.com/en/dev/topics/db/multi-db/…
    【解决方案2】:

    文档没有说明表单保存方法的 using 参数。不过,有一个用于模型保存。所以你可以通过commit=False保存得到模型对象,然后用using保存:

    selectedObject = formCompany2.save(commit=False)
    selectedObject.save(using='dataset')
    

    【讨论】:

    • 你好丹尼尔,谢谢你的回答我已经试过了,就像你在这里解释的那样:stackoverflow.com/questions/6118884/… 但是我有一个错误,就像我没有取消 "using='dataset' => (1146 , "表 'myproject.company_dataset' 不存在")
    【解决方案3】:

    解决方案是创建一个数据库用户:https://docs.djangoproject.com/en/dev/topics/db/multi-db/#database-routers

    这是我在最初问题中给出的示例的工作示例:

    dbRouter.py

    import django
    from company.models import CompanyDataset
    
    
    class CompanyDatasetRouter(object):
    
        def db_for_read(self, model, **hints):
            #if isinstance(model, CompanyDataset):
            if model == CompanyDataset:
                return 'dataset'
            else:
                return 'default'
    
        def db_for_write(self, model, **hints):
            if model == CompanyDataset:
                return 'dataset'
            else:
                return 'default'
    

    感谢大家的帮助:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-20
      • 1970-01-01
      • 2013-06-07
      • 1970-01-01
      • 2020-05-14
      • 1970-01-01
      • 2016-09-17
      相关资源
      最近更新 更多