【问题标题】:Django ORM create rows dynamically with _meta.get_fields()Django ORM 使用 _meta.get_fields() 动态创建行
【发布时间】:2021-09-26 16:56:28
【问题描述】:

我正在编写一个函数来读取 xlsx 并使用 Django 将此数据写入数据库。但是我有太多无法静态定义的字段。我想用某种算法将这些字段写入数据库。在设计这个时,我使用 _meta.get_fields() 获取类属性。但如本例所示,属性始终保持为无。在views.py 中有一个BEGIN 和END 代码之间的例子。我该如何解决这个问题?

views.py

# ... some codes ...
@login_required(login_url='/admin/login/')
def import_process(request):
    if request.method == 'POST':
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            file_in_memory = request.FILES['file'].read()
            wb = load_workbook(filename=BytesIO(file_in_memory), data_only=True)
            ws = wb.worksheets[0]
            ws_company_name = str(ws["D9"].value)
            ws_company_address = str(ws["D10"].value)
            # ... some codes ...
            # Company Tower Get ID loop
            company_staff = CompanyStaff.objects.filter(company_id=Company.objects.filter(company_name=ws_company_name)[0].id)[0]
            for col in COLUMN_PARAMETER_LIST:
                column_cell = str(col) + str(COLUMN_PARAMETER_BEGIN)
                ws_tower_type = str(ws[column_cell].value)
                tower_type = TowerType.objects.filter(tower_type=ws_tower_type)[0]
                c_tower_object = CompanyTower.objects.filter(company_staff_id=company_staff,tower_type_id=tower_type)[0]
                tower_data = TowerData.objects.create(company_tower_id=c_tower_object)
                ROW_IDX = int(ROW_PARAMETER_BEGIN-1)
                # ****************** BEGIN ****************** #
                site_fields = tower_data._meta.get_fields()
                site_fields_names = [f.name for f in site_fields][1:]
                for mfield in site_fields_names:
                    if any(word in str(mfield) for word in TOWER_DATA_EXCLUDE_FIELDS_NEW):
                        continue
                    else:
                        ROW_IDX += 1
                    tower_data_cell = str(col)+str(ROW_IDX)
                    tower_data_cell_value = ws[tower_data_cell].value
                    tower_data.mfield = tower_data_cell_value
                    if str(mfield) == 'ph': # Example Field
                        print(tower_data.mfield)
                        print(tower_data.ph)
                # ******************* END ******************* #
                tower_data.save()
            print("****************")
    
    return render(request, template_name='import.html',context={"form": UploadFileForm()})
# ... some codes ...

【问题讨论】:

  • 请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。

标签: python django orm row field


【解决方案1】:

您当前正在反复设置和替换名为 mfield 的属性:tower_data.mfield = tower_data_cell_value

你想要的是setattr(tower_data, mfield, tower_data_cell_value)

【讨论】:

  • 非常感谢,我删除了这一行:“tower_data.mfield = tower_data_cell_value”并添加了这一行:“setattr(tower_data, mfield, tower_data_cell_value)”然后问题解决了。
猜你喜欢
  • 2020-05-10
  • 2015-01-22
  • 2021-11-01
  • 2013-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 2013-11-03
相关资源
最近更新 更多