Каковы лучшие практики для массовой загрузки .csv файла в Django?
У меня есть простой модуль загрузки CSV файла для массовой загрузки данных POS. Пример кода ниже..
models.py
class POSData(models.Model):
outlet_name = models.CharField(...)
food_item = models.ForeignKey('FoodItem', ...)
order_date = models.DateField(...)
...
class Ingredient(models.Model):
ingredient_name = models.CharField(...)
...
class FoodItem(models.Model):
item_name = models.CharField(...)
item_key = models.IntegerField(unique=True)
...
class RecipeItem(models.Model):
food_item = models.ForeignKey(FoodItem, ...)
ingredient = models.ForeignKey(Ingredient, ...)
quantity = models.Charfield(...)
...
class POSIngredientData(models.Model):
outlet_name = models.CharField(...)
ingredient = models.ForeignKey(Ingredient, ...)
quantity = models.Charfield(...)
order_date = models.DateField(...)
...
views.py #Пример кода для обработки загрузки файла .csv
file = request.FILES['order_file']
decoded_file = file.read().decode('utf-8').splitlines()
# creating a csv dictionary reader object
csvDictReader = csv.DictReader(decoded_file, delimiter=',')
for obj in csvDictReader:
try:
food_item = FoodItem.objects.get(item_key=obj['item_key'])
except FoodItem.DoesNotExist:
# Do Something Here
pass
POSData.objects.create(food_item=food_item, ...)
recipesItemQS = RecipeItem.objects.filter(food_item=food_item)
# uploading POS data of ingredients in separate model to help in qs
# Average 10 ingredients in a foodItem recipe
for recipeItem in recipesItemQS:
POSIngredientData.objects.create(ingredient=recipeItem.ingredient, ...)
Мой вопрос заключается в том, что загрузка всех данных в базу данных занимает слишком много времени (5-10 секунд для загрузки одной строки из .csv файла). Есть ли какой-нибудь более эффективный способ выгрузки большого количества данных из .csv файла? Также, я где-то читал, что для массовой выгрузки следует использовать метод Model.save() вместо Model.create(). Я не смог понять, почему, поскольку Model.create() использует тот же метод save().
Я новичок в Django и учусь, совершая ошибки и практикуясь. Примите мои извинения, если вопрос сформулирован неправильно или есть грамматические ошибки.
Метод 1:
Вы можете использовать .bulk_create()
.
Вы можете сначала создать обычный список объектов POSIngredientData и добавить его внутри параметра objs в .bulk_create()
следующим образом
listOfPosIngredient = [POSIngredientData(ingredient=recipeItem.ingredient) for recipeItem in recipesItemQS] #Creates a list of POSIngredientData objects
POSIngredientData.objects.bulk_create(listOfPosIngredient) #Calls the bulk create method to push everything in ONE QUERY.
Метод 2
Вы также можете использовать аккуратный плагин django под названием django-import-export, который также совместим с django admin.