在 Django 中批量上传 .csv 文件的最佳做法是什么?
what are the best practices for bulk upload of .csv file in 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, ...)
我的问题是,将所有数据上传到数据库需要很长时间(上传一行 .csv 文件需要 5-10 秒)。 有没有更有效的方法从 .csv 文件上传批量数据? 另外,我在某处读到 Model.save() 方法应该使用 Model.create() 来代替批量上传。 我不明白为什么 Model.create() 使用相同的 save() 方法。
我是 Django 的新手,正在通过犯错和练习来学习。如果问题措辞不正确或有任何语法错误,请接受我的道歉。
方法一:
您可以使用 .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-import-export 的简洁 django 插件,它也与 django admin 兼容。
我有一个简单的 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 的新手,正在通过犯错和练习来学习。如果问题措辞不正确或有任何语法错误,请接受我的道歉。
方法一:
您可以使用 .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-import-export 的简洁 django 插件,它也与 django admin 兼容。