在Django中使用迁移手动创建表,无法添加外键

时间:2019-07-19 02:11:54

标签: python django python-3.x shell

我想动态创建一些名称不同但结构相同的表。我不想使用SQL语句,所以我尝试手动编写一些迁移的代码,但是出现了一些错误。

我正在使用Django 2.2.3,python 3.6.6,我尝试删除外键字段并成功生成了一个表,但是在添加了外键字段之后,出现了以下错误。

这是生成表的代码

class DynamicModel(object):
    """动态模型"""

    def get_fields(suffix):
        print(suffix)
        if suffix == "_data_stores":
            return Fields.BaseFields + Fields.DataStores

    @staticmethod
    def create_tables(prefix=None, app_udid=None, suffix=None, app_label="apptutti"):
        """
        创建表
        :param prefix: 前缀
        :param app_udid: 游戏ID
        :param suffix: 后缀
        :param app_label: 应用标识
        :return:None
        """
        if not all([prefix, app_udid, suffix]):
            return "表名参数错误"
        table_name = app_udid + suffix

        class Migration(migrations.Migration):
            initial = True
            dependencies = []
            operations = [
                migrations.CreateModel(
                    name=table_name,
                    fields=DynamicModel.get_fields(suffix)
                ),
            ]

        executor = MigrationExecutor(connection)
        migration = Migration(table_name, app_label)
        with connection.schema_editor(atomic=True) as schema_editor:
            migration.apply(executor._create_project_state(), schema_editor)

我可以这样称呼它。

app_udid = '2016021021523547311'  # Blocky Cars Online
        prefix = 'apptutti'  # Blocky Cars Online
        suffix = '_data_stores'  # Blocky Cars Online

        DynamicModel.create_tables(prefix=prefix, app_udid=app_udid, suffix=suffix)

如果包含外键字段,则会收到错误消息。

Traceback (most recent call last):
  File "/home/andrew/.local/share/virtualenvs/apptutti_data-e08CDXCQ/lib/python3.6/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/home/andrew/.local/share/virtualenvs/apptutti_data-e08CDXCQ/lib/python3.6/site-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/home/andrew/.local/share/virtualenvs/apptutti_data-e08CDXCQ/lib/python3.6/site-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/andrew/.local/share/virtualenvs/apptutti_data-e08CDXCQ/lib/python3.6/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "/home/andrew/.local/share/virtualenvs/apptutti_data-e08CDXCQ/lib/python3.6/site-packages/django/views/generic/base.py", line 71, in view
    return self.dispatch(request, *args, **kwargs)
  File "/home/andrew/.local/share/virtualenvs/apptutti_data-e08CDXCQ/lib/python3.6/site-packages/rest_framework/views.py", line 497, in dispatch
    response = self.handle_exception(exc)
  File "/home/andrew/.local/share/virtualenvs/apptutti_data-e08CDXCQ/lib/python3.6/site-packages/rest_framework/views.py", line 457, in handle_exception
    self.raise_uncaught_exception(exc)
  File "/home/andrew/.local/share/virtualenvs/apptutti_data-e08CDXCQ/lib/python3.6/site-packages/rest_framework/views.py", line 468, in raise_uncaught_exception
    raise exc
  File "/home/andrew/.local/share/virtualenvs/apptutti_data-e08CDXCQ/lib/python3.6/site-packages/rest_framework/views.py", line 494, in dispatch
    response = handler(request, *args, **kwargs)
  File "/home/andrew/workspace/apptutti_data/apptutti_data/apps/at_data/views/GetDataViews.py", line 19, in get
    DynamicModel.create_tables(prefix=prefix, app_udid=app_udid, suffix=suffix)
  File "/home/andrew/workspace/apptutti_data/apptutti_data/apps/at_data/models/DynamicModel.py", line 44, in create_tables
    migration.apply(executor._create_project_state(), schema_editor)
  File "/home/andrew/.local/share/virtualenvs/apptutti_data-e08CDXCQ/lib/python3.6/site-packages/django/db/migrations/migration.py", line 124, in apply
    operation.database_forwards(self.app_label, schema_editor, old_state, project_state)
  File "/home/andrew/.local/share/virtualenvs/apptutti_data-e08CDXCQ/lib/python3.6/site-packages/django/db/migrations/operations/models.py", line 90, in database_forwards
    model = to_state.apps.get_model(app_label, self.name)
  File "/home/andrew/.local/share/virtualenvs/apptutti_data-e08CDXCQ/lib/python3.6/site-packages/django/utils/functional.py", line 80, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/home/andrew/.local/share/virtualenvs/apptutti_data-e08CDXCQ/lib/python3.6/site-packages/django/db/migrations/state.py", line 210, in apps
    return StateApps(self.real_apps, self.models)
  File "/home/andrew/.local/share/virtualenvs/apptutti_data-e08CDXCQ/lib/python3.6/site-packages/django/db/migrations/state.py", line 280, in __init__
    raise ValueError("\n".join(error.msg for error in errors))
ValueError: The field apptutti.2016021021523547311_data_stores.channels_id was declared with a lazy reference to 'apptutti.channels', but app 'apptutti' doesn't provide model 'channels'.

我想得到一个这样的表并包含外键 下面是我设置的字段。

DataStores = [
    ('channels_id', models.ForeignKey(to='Channels',
                                      on_delete=models.CASCADE,
                                      related_name='channel',
                                      verbose_name='channel',
                                      help_text="channel")),

    ('new_equip_num', models.IntegerField(null=True, default=0, verbose_name="新设备数", help_text='新设备数')),
    ('new_uid_num', models.IntegerField(null=True, default=0, verbose_name="新UID数", help_text='新UID数')),
    ('new_player_num', models.IntegerField(null=True, default=0, verbose_name="新玩家数", help_text='新玩家数')),
    ('dau', models.IntegerField(null=True, default=0, verbose_name="日活跃数", help_text='日活跃数')),
    ('amount', models.IntegerField(null=True, default=0, verbose_name="总金额数", help_text='总金额数')),
    ('pay_user_count', models.IntegerField(null=True, default=0, verbose_name="付费玩家数", help_text='付费玩家数')),
    ('frequency', models.IntegerField(null=True, default=0, verbose_name="支付频率", help_text='支付频率')),
]

0 个答案:

没有答案