繁体   English   中英

如何在 Django Rest Framework 中使用 CSV 文件批量更新

[英]How to bulk update using CSV file in Django Rest Framework

class PackageRateListPrice(core_models.TimestampedModel):
package = models.ForeignKey(
    PackageLabPrice, related_name="package_ratelist_price", on_delete=models.CASCADE
)
offer_price = models.FloatField(null=True, blank=True, default=None)
addon_price = models.FloatField(null=True, blank=True, default=None)
is_active = models.BooleanField(default=True)

我的观点:

class BulkUpdatePackageRateListPriceUpdateFromFile(APIView):
permission_classes = [IsAuthenticated, ]

def put(self, request, pk, *args, **kwargs):
    upload_file = request.FILES.get('package_ratelist_file')
    file = upload_file.read().decode('utf-8')

    reader = csv.DictReader(io.StringIO(file))
    data = [line for line in reader]
    for item in data:
        package_id = item['PackageID']
        offer_price = item['OfferPrice']
        addon_price = item['AddOnPrice']
        is_active = item['IsActive']

        models.PackageRateListPrice(package_id = package_id, offer_price = offer_price,addon_price = addon_price,
         is_active = is_active).save()
    return Response({"status": True}, status=status.HTTP_200_OK)

在这我试图从 csv 文件批量更新。 所以首先我需要检查 package_id(first_field) 是否存在,如果它存在,那么它将更新那个 id。 任何帮助将不胜感激。 谢谢 !!

您可以使用QuerySetbulk_createbulk_update方法。

对于bulk_create你可以这样做:

reader = csv.DictReader(io.StringIO(file))
data = list(reader)
objs = [
    PackageRateListPrice(
        package_id = item['PackageID']
        offer_price = item['OfferPrice']
        addon_price = item['AddOnPrice']
        is_active = item['IsActive']
    )
    for item in data
]
PackageRateListPrice.objects.bulk_create(objs)

对于bulk_update有点棘手,因为您必须提供现有对象(及其各自的 pk)。 所以你可能会得到你需要更新的对象,然后改变你需要更新的值,最后运行bulk_update方法。

来自 Django 文档的示例:

objs = [
    Entry.objects.create(headline='Entry 1'),
    Entry.objects.create(headline='Entry 2'),
]
objs[0].headline = 'This is entry 1'
objs[1].headline = 'This is entry 2'
Entry.objects.bulk_update(objs, ['headline'])

您可以替换在示例中为过滤器查询创建的对象:

objs = PackageRateListPrice.objects.filter(field__in=list_of_values_from_csv)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM