Как выполнить массовое обновление с помощью CSV-файла в 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. Любая помощь будет очень признательна. Спасибо!!!
Вы можете использовать методы QuerySet, bulk_create и bulk_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 Docs:
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)