我想动态创建一些名称不同但结构相同的表。我不想使用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='支付频率')),
]