代码之家  ›  专栏  ›  技术社区  ›  Nimish Bansal

使用模型表单在不同的数据库中保存数据

  •  1
  • Nimish Bansal  · 技术社区  · 7 年前

    问题是我有一个模型,其中一个字段是唯一的。我在post body中输入来自用户的字段值,并希望通过模型表单将其保存在post body中指定的数据库中。

    # models.py
    class Type(models.Model):
        name = models.CharField(max_length=100, unique=True)
        created_at = models.DateTimeField(auto_now_add=True, editable=True)
    
        def __str__(self):
            return self.name
    
    #forms.py
    class TypeCreateForm(forms.ModelForm):
        class Meta:
            model = Type
            fields = "__all__"
    
    # settings.py
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': "default",
            'USER': 'root',
            'PASSWORD': 'abcd1234',
            'HOST': '0.0.0.0',
            "PORT": "3306"
        },
        'database1': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': "database1",
            'USER': 'root',
            'PASSWORD': 'abcd1234',
            'HOST': '0.0.0.0',
            "PORT": "3306"
        },
    }
    
    #views.py
    def index(request):
        db_name=request.POST["db_name"]
        ob = TypeCreateForm(request.POST)
        for a in ob:
            if a.errors:
                print(a.errors.as_text())
    
        ob=ob.save(commit=False)
        ob.save(using=db_name)
    

    我搜索了几个类似的问题,将其保存到另一个数据库中,而不是默认。有些建议 commit=False 将与save一起使用关键字参数。

    在某些回答中,他们建议对字段的查询集进行修改。 但是我不认为这对我有用,因为在我的模型中有一个唯一的约束,所以当我在保存之前打印错误时,如果该类型存储在default db中,即使我想保存在第二个数据库中,也会显示唯一约束失败。

    有没有任何方法,我可以这样做,当启动一个窗体对象,我也指定了数据库名称,它将保存到该数据库和错误也会相应地来选择数据库

    我也不能用 Type.objects.using(db_name).create() 因为我以后可能还会添加只能通过表单检查的验证。

    0 回复  |  直到 7 年前