【问题标题】:define database modelwise in django在 django 中按模型定义数据库
【发布时间】:2018-01-09 11:31:04
【问题描述】:

我只是试图找到一个在 Django 中明智地定义数据库模型的解决方案。 就像在我的 settings.py 中一样,有三个数据库

settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    },
    'db_one': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db_one.sqlite3'),
    },
    'db_two': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db_two.sqlite3'),
    },
}

在我的 polls/models.py 中

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')


    def __str__(self):
        return self.question_text

    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)

@python_2_unicode_compatible
class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)


    def __str__(self):
        return self.choice_text

现在我想在 db_one 数据库中添加问题模型,在 db_two 数据库中添加选择模型,我该怎么做

我尝试使用路由器遵循此multiple databases and multiple models in django 但只有在我尝试将空白设置放入默认数据库并尝试迁移之后它才更喜欢默认数据库,但它给了我一个错误

这是在 Django 中为应用程序定义数据库的方式

【问题讨论】:

    标签: python django database django-models


    【解决方案1】:

    您可以使用数据库我的using 方法。

    例如,从db_one 获取所有数据如下所示:

    all_data = YourModel.objects.using('db_one').all()

    【讨论】:

    • 首先在图片后面获取数据我只想将该表创建到数据库中,问题是我无法迁移该表(创建表)
    【解决方案2】:

    您需要将模型迁移到默认数据库以外的数据库,对吧?

    您可以在迁移时选择数据库。

    # database name from settings.py
    ./manage.py migrate --database=<database-name>
    

    django docs

    如果您想在一个数据库中保留一些表,而在其他数据库中保留一些表,我建议为每个表创建一个迁移。然后,你就可以运行了

    ./manage.py migrate <your-app-name> <migration-number> --database=<database-name>
    

    编辑

    您可以使用--fake 标志跳过在特定数据库中创建特定表。​​

    • 首先,删除所有迁移。
    • models.py 中注释掉你的Choice 模型。
    • 运行manage.py makemigrations =>假设这个创建的迁移001(对于Question模型)
    • models.py 中取消对Choice 模型的评论。
    • 再次运行manage.py makemigrations。假设这创建了迁移002(对于Choice 模型)
    • 运行manage.py migrate &lt;app-name&gt; 001 --database=db_one =>这将在db_one中创建问题模型
    • 运行manage.py migrate &lt;app-name&gt; 001 --database=db_two --fake =>这个
      将跳过在 db_two 中创建表
    • 运行python manage.py migrate &lt;app-name&gt; 002 --database=db_one --fake => 这将跳过在 db_one 中创建 Choice 表
    • 运行 python manage.py migrate &lt;app-name&gt; 002 --database=db_two => 这将在 db_two 中创建 Choice 模型。

    【讨论】:

    • 不,我想在迁移表时使用一个应用程序的单独模型,以便它只创建默认数据库
    • 分开是什么意思?将表的副本保存在不同的数据库中?
    • 不,我不想创建 Question 模型的副本仅在 db_one 中创建,Choice 表仅在 db_two 中创建,默认情况下不或任何其他数据库
    • 好的,那么,正如我在第二部分中指出的那样,您需要为每个模型创建一个迁移。然后,有选择地在数据库上运行迁移。我将更新我的答案,以展示如何跳过在特定数据库上创建表。实际上,您需要为此使用 --fake 选项。
    猜你喜欢
    • 1970-01-01
    • 2014-08-15
    • 2015-10-10
    • 2019-03-18
    • 2017-11-07
    • 1970-01-01
    • 2011-03-31
    • 2016-05-14
    • 1970-01-01
    相关资源
    最近更新 更多