2017-10-19 39 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)