【问题标题】:what are the best practices for bulk upload of .csv file in Django?在 Django 中批量上传 .csv 文件的最佳做法是什么?
【发布时间】:2021-10-31 21:59:00
【问题描述】:

我有一个简单的 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, ...)

我的问题是,将所有数据上传到数据库需要太长时间(上传一行 .csv 文件需要 5-10 秒)。 有没有更有效的方法从 .csv 文件上传批量数据? 另外,我在某处读到应该使用 Model.save() 方法而不是 Model.create() 用于批量上传。 我不明白为什么 Model.create() 使用相同的 save() 方法

我是 Django 新手,我通过犯错和练习来学习。如果问题措辞不正确或有任何语法错误,请接受我的歉意。

【问题讨论】:

  • 您的 CSV 文件是否包含多个模型字段值?
  • 不,它只包含来自 POSData 模型的字段。如果它确实包含多个模型字段值怎么办?

标签: django csv django-models django-orm


【解决方案1】:

方法一:

您可以使用.bulk_create()

可以先创建一个POSIngredientData的普通对象列表,像这样添加到.bulk_create()的objs参数里面

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.

方法二

您还可以使用一个简洁的 django 插件,名为 django-import-export,它也与 django admin 兼容。

【讨论】:

  • 感谢@Ruchit 回答我的问题。我阅读了 .bulk_create() 方法 的 Django 文档,它回答了我关于批量上传的大部分问题。由于我没有足够的声誉,因此我无法为您的回复投票。
猜你喜欢
  • 2012-06-08
  • 1970-01-01
  • 1970-01-01
  • 2015-04-30
  • 2020-05-12
  • 2015-01-23
  • 2018-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多