2017-10-19 82 views
0

我是新来的Django,我开始做一个项目,包括创建一个基于csv文件的动态表。该程序必须管理列的添加和删除。动态Django模型表x不存在

我面临的一个问题是,该表不存在,我不明白为什么......我想这是一个基本问题。 (1146, “表X不存在”)

CSV文件被加载:在此创建 蟒/ 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') 

型号: 的Python

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() 

动态型号工厂: Python

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 

履行表: Python的

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

您创建一个模型。通常情况下,你需要在它后面运行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"]) 

如果有任何的工作,或者你找到一个不错的答案你自己,请分享结果。我真的很好奇这个:)

+0

谢谢,让我们给一试!我如何知道我的模型已准备好? ^^' – Madostrich

+0

@Madostrich“ready”我的意思是已经存在,由您的工厂创建。如果它在'AppConfig.ready()'之前存在,很可能它不会,因为我看到'request'参数... – Art

+0

是的,它不。我尝试了management.call_command(“makemigrations”,[“yourappname”])management.call_command(“migrate”,[“yourappname”]),似乎我的服务器不明白... – Madostrich

0

一种解决方案是schema_editor

from django.db import connection, migrations, models 

with connection.schema_editor() as schema_editor: 
     schema_editor.create_model(model)