我是Django的新手,我开始做一个项目,包括创建一个基于csv文件的动态表。该程序必须动态管理列添加和删除。
我面临一个问题,即桌子不存在,我不明白为什么......我想这是一个基本问题。 (1146,“表x不存在”)
已加载CSV文件: python / views.py
def gestionTable(request) :
if (request.method == 'POST' and request.FILES['file']) :
if (handle_uploaded_file(request.FILES['file'], request.POST['table'])) :
messages.success(request, 'ok')
else :
messages.error(request, _("failed"))
return HttpResponseRedirect('#')
return render(request, 'weather/gestion_table.html')
模型在这里创建: 蟒
def csv_to_model(f, tableName):
reader = csv.reader(f, delimiter=";")
data_list = list(reader)
col_names = data_list[0]
first_values = data_list[1]
fields = {}
for i in range(len(col_names)) :
try :
fields[col_names[i]] = typeDeduce(type(literal_eval(first_values[i])).__name__)
print(typeDeduce(type(literal_eval(first_values[i])).__name__))
except ValueError:
fields[col_names[i]] = typeDeduce("str")
return create_model(name=str(tableName), fields=fields, app_label="weather", module="weather")
def typeDeduce(a):
if (a == "int") :
return models.IntegerField()
if (a == "float") :
return models.FloatField()
if (a == "str") :
return models.CharField()
动态模型工厂: 蟒
def create_model(name, fields=None, app_label='', module='', options=None, admin_opts=None):
class Meta:
pass
if app_label:
setattr(Meta, 'app_label', app_label)
if options is not None:
for key, value in options.iteritems():
setattr(Meta, key, value)
attrs = {'__module__': module, 'Meta': Meta}
if fields:
attrs.update(fields)
model = type(name, (models.Model,), attrs)
if admin_opts is not None:
class Admin(admin.ModelAdmin):
pass
for key, value in admin_opts:
setattr(Admin, key, value)
admin.site.register(model, Admin)
return model
完成表格: 蟒
def fulfillTable(f, model, tableName):
reader = csv.reader(f, delimiter=";")
data_list = list(reader)
col_names = data_list[0]
fieldsList = model._meta.get_fields()
print(fieldsList)
values = {}
for row in data_list[1:] :
for i in range(len(col_names)) :
try :
values[col_names[i]] = literal_eval(row[i])
except ValueError :
values[col_names[i]] = row[i]
model.objects.update_or_create(values) ERROR
答案 0 :(得分:0)
您创建了一个模型。通常,您需要在其后运行manage.py makemigrations && manage.py migrate
。
但是因为你有一个模型工厂,所以你有一个问题。
如果您不打算使用Django ORM来处理动态创建的模型中的数据,那么最好的选择是使用raw sql queries。
如果您计划将Django ORM用于这些模型......那么您可能已经搞砸了。一些想法:
如果您已准备好启动应用程序,则可以尝试使用AppConfig .ready
如果在启动您的应用时不知道/准备好模型,您可以试试下面代码的运气。
免责声明:我对它是否有机会工作没有任何想法。
from django.core import management
from myapp import models
setattr(models, dynamic_model_name, model)
management.call_command("makemigrations", ["yourappname"])
management.call_command("migrate", ["yourappname"])
如果有效,或者您自己找到了一个好的答案,请分享结果。我真的好奇这个:)
答案 1 :(得分:0)
解决方案是schema_editor:
from django.db import connection, migrations, models
with connection.schema_editor() as schema_editor:
schema_editor.create_model(model)