动态Django模型表x不存在

时间:2017-10-19 08:59:39

标签: django csv dynamic

我是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

2 个答案:

答案 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)