使用Django API进行批量创建和更新记录的问题

如何解决使用Django API进行批量创建和更新记录的问题

django的新手,正在使用csv批量创建和更新数据库中的行。我正在使用这个:

https://pypi.org/project/django-bulk-update-or-create/#description

我可以得到第一个选项:bulk_update_or_create工作正常,但是当我使用批量选项:bulk_update_or_create_context时,它会将数据上传到我的数据库中,但仅作为数字(下面的示例)-我确实缺少一些东西在这里很明显,但我无法弄清楚。

例如,我期望这样的数据(以及使用第一个选项bulk_update_or_create得到的数据:

vsim_iccid - 8997103118112597732F (pk)
country_or_region - AE_UNITED araB EMIRATES
operator - DU
vsim_imsi - 424030246932624
online_country - AE
sim_status - Enable,plmn_set - 42403
package1 - UAE 50
package2 - blank

当我使用批量选项bulk_update_or_create_context时,我得到了这个信息:

vsim_iccid - 1
country_or_region - 21
vsim_imsi - 21
online_country - 21
sim_status - 21
plmn_set - 21
package1 - 21
package2 - 21

代码

def upload_vsim_mgmt(request):
    form = CsvModelForm(request.POST or None,request.FILES or None)
    if form.is_valid():
        form.save()
        form = CsvModelForm()
        obj = Csv.objects.get(activated=False)
        with open(obj.file_name.path,'r') as f:
            df = pd.read_csv(f,encoding='latin1',error_bad_lines=False,index_col=False,dtype='unicode',sep=',').replace(np.nan,'',regex=True).replace("\t",regex=True)
            #print(df)
            row_iter = df.iterrows()
            items = [
                VSIMData(
                    country_or_region=row['Country or Region    '],operator=row['Operator  '],vsim_imsi=row['imsI '],vsim_iccid=row['iccid   '],online_country=row['Online Country or Region    '],sim_status=row['SIM Status  '],plmn_set=row['PLMN Set  '],package1=row['Package 1 '],package2=row['Package 2 '],)
            for index,row in row_iter
        ]
        with VSIMData.objects.bulk_update_or_create_context(['operator','country_or_region','vsim_imsi','online_country','sim_status','plmn_set','package1','package2'],match_field='vsim_iccid',batch_size=100) as bulkit:
            for i in range(10000):
                bulkit.queue(VSIMData(vsim_iccid=i,operator=i+20,country_or_region=i+20,vsim_imsi=i+20,online_country=i+20,sim_status=i+20,plmn_set=i+20,package1=i+20,package2=i+20))
        obj.activated = True
        obj.save()

型号:

 class VSIMData(models.Model):
    objects = bulkupdateOrcreatequerySet.as_manager()
    country_or_region = models.CharField(max_length=250,blank=True,null=True)
    operator = models.CharField(max_length=50,null=True)
    vsim_imsi = models.CharField(max_length=20,null=True)
    vsim_iccid = models.CharField(max_length=20,unique=True,primary_key=True)
    online_country = models.CharField(max_length=2,null=True)
    sim_status = models.CharField(max_length=50,null=True)
    plmn_set = models.CharField(max_length=250,null=True)
    package1 = models.CharField(max_length=50,null=True)
    package2 = models.CharField(max_length=50,null=True)


    def __str__(self):
        return self.vsim_iccid

对我要去哪里的任何帮助将非常感谢!

解决方法

为此做个回答,因为它太大了,无法发表评论。我阅读了链接的软件包页面,坦白地说,我感到困惑。包页面上的示例和您的示例都无法引用items变量。

从包裹页面:

with RandomData.objects.bulk_update_or_create_context(['data'],match_field='uuid',batch_size=10) as bulkit:
    for i in range(10000):
        bulkit.queue(RandomData(uuid=i,data=i + 20))

根据您发布的代码

with VSIMData.objects.bulk_update_or_create_context(['operator','country_or_region','vsim_imsi','online_country','sim_status','plmn_set','package1','package2'],match_field='vsim_iccid',batch_size=100) as bulkit:
            for i in range(10000):
                bulkit.queue(VSIMData(vsim_iccid=i,operator=i+20,country_or_region=i+20,vsim_imsi=i+20,online_country=i+20,sim_status=i+20,plmn_set=i+20,package1=i+20,package2=i+20))

这与打包页面使用bulk_update_or_create的方式不同

items = [
    RandomData(uuid=1,data='data for 1'),RandomData(uuid=2,data='data for 2'),]
RandomData.objects.bulk_update_or_create(items,['data'],match_field='uuid')

这里显式地引用了这些项。老实说,我在想包装页面上列出的代码可能实际上不起作用。我将深入研究该库的源代码。也许在bulk_update_or_create方法中放一个pdb来尝试找出正在发生的事情。我以为您需要以某种方式引用您在示例中先前构造的item变量。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?