使用Django api通过csv批量创建和更新记录的问题

2024-05-03 11:33:51 发布

您现在位置:Python中文网/ 问答频道 /正文

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, blank=True, null=True)
    vsim_imsi = models.CharField(max_length=20, blank=True, null=True)
    vsim_iccid = models.CharField(max_length=20, unique=True, primary_key=True)
    online_country = models.CharField(max_length=2, blank=True, null=True)
    sim_status = models.CharField(max_length=50, blank=True, null=True)
    plmn_set = models.CharField(max_length=250, blank=True, null=True)
    package1 = models.CharField(max_length=50, blank=True, null=True)
    package2 = models.CharField(max_length=50, blank=True, null=True)


    def __str__(self):
        return self.vsim_iccid

在我出错的地方提供任何帮助都会很棒,谢谢


Tags: ortruemodelscreateupdatebulkcountrynull
1条回答
网友
1楼 · 发布于 2024-05-03 11:33:51

这是一个答案,因为它有点太大了,无法发表评论。我读了链接包页面,坦率地说,我很困惑。包页面上的示例和您的示例都未能引用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))

这与包页面使用批量更新或创建的方式不同

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来尝试找出发生了什么。我认为您需要以某种方式引用前面在示例中构造的items变量

相关问题 更多 >