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

Вернуться на верх