Каковы лучшие практики для массовой загрузки .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.