python queryset切片 如何将csv数据导入django模型




queryset切片 (11)

您可以使用django-csv-importer包。 http://pypi.python.org/pypi/django-csv-importer/0.1.1

它像django模型一样工作

MyCsvModel(CsvModel):
    field1 = IntegerField()
    field2 = CharField()
    etc

    class Meta:
        delimiter = ";"
        dbModel = Product

你只需要:CsvModel.import_from_file(“我的文件”)

这将自动创建您的产品。

我有一些CSV数据,我想使用示例CSV数据导入django模型:

1;"02-01-101101";"Worm Gear HRF 50";"Ratio 1 : 10";"input shaft, output shaft, direction A, color dark green";
2;"02-01-101102";"Worm Gear HRF 50";"Ratio 1 : 20";"input shaft, output shaft, direction A, color dark green";
3;"02-01-101103";"Worm Gear HRF 50";"Ratio 1 : 30";"input shaft, output shaft, direction A, color dark green";
4;"02-01-101104";"Worm Gear HRF 50";"Ratio 1 : 40";"input shaft, output shaft, direction A, color dark green";
5;"02-01-101105";"Worm Gear HRF 50";"Ratio 1 : 50";"input shaft, output shaft, direction A, color dark green";

我有一些名为Product的django型号。 在产品中有一些字段,如namedescriptionprice 。 我想要这样的东西:

product=Product()
product.name = "Worm Gear HRF 70(02-01-101116)"
product.description = "input shaft, output shaft, direction A, color dark green"
product.price = 100


在models.py中定义类及其中的函数。

class all_products(models.Model):
    def get_all_products():
        items = []
        with open('EXACT FILE PATH OF YOUR CSV FILE','r') as fp:
            # You can also put the relative path of csv file
            # with respect to the manage.py file
            reader1 = csv.reader(fp, delimiter=';')
            for value in reader1:
                items.append(value)
        return items

您可以访问列表中的ith元素作为项[i]


如果你想使用一个库,快速谷歌搜索csvdjango显示两个库 - django-csvimportdjango-adaptors 。 让我们读一下他们对自己说的话......

  • django适配器

Django适配器是一个工具,允许您轻松地将CSV / XML文件转换为python对象或django模型实例。

  • django-importcsv

django-csvimport是一个通用的导入工具,允许上传CSV文件以填充数据。

第一个需要你编写一个模型来匹配csv文件,而第二个更像是一个命令行导入器,这与你使用它们的方式有很大的不同 ,每个都适用于不同类型的项目。

那么哪一个使用? 这取决于从长远来看哪些更适合您的项目。

但是,您也可以通过编写自己的django脚本来导入csv文件,完全避免使用库(类似于警告,伪代码):

# open file & create csvreader
import csv, yada yada yada

# import the relevant model
from myproject.models import Foo

#loop:
for line in csv file:
     line = parse line to a list
     # add some custom validation\parsing for some of the fields

     foo = Foo(fieldname1=line[1], fieldname2=line[2] ... etc. )
     try:
         foo.save()
     except:
         # if the're a problem anywhere, you wanna know about it
         print "there was a problem with line", i 

这非常容易。 地狱,你可以通过django shell以交互方式进行,如果它是一次性导入的话。 只是 - 弄清楚你想要对你的项目做什么,你需要处理多少文件然后 - 如果你决定使用一个库,试着找出哪一个更适合你的需要


像这样的东西:

f = open('data.txt', 'r')  
for line in f:  
   line =  line.split(';')  
   product = Product()  
   product.name = line[2] + '(' + line[1] + ')'  
   product.description = line[4]  
   product.price = '' #data is missing from file  
   product.save()  

f.close()  

你可以尝试django-import-export 。 它具有良好的管理集成,更改预览,可以创建,更新,删除对象。


考虑使用Django的内置反序列化器。 Django的docs编写得很好,可以帮助您入门。 考虑将数据从csv转换为XML或JSON,并使用反序列化器导入数据。 如果您是从命令行执行此操作(而不是通过Web请求),则loaddata manage.py命令将特别有用。


你想使用作为python语言一部分的csv模块,你应该使用Django的get_or_create方法

 with open(path) as f:
        reader = csv.reader(f)
        for row in reader:
            _, created = Teacher.objects.get_or_create(
                first_name=row[0],
                last_name=row[1],
                middle_name=row[2],
                )
            # creates a tuple of the new object or
            # current object and a boolean of if it was created

在我的示例中,模型教师有三个属性first_name,last_name和middle_name。

Django get_or_create方法的文档


Python csv库可以进行解析,您的代码可以将它们转换为Products()


使用Pandas库创建csv数据的数据框。
通过将字段包含在csv文件的第一行或代码中,使用数据框的列方法命名字段。
然后创建模型实例列表。
最后使用django方法.bulk_create()将模型实例列表发送到数据库表。

read_csv中的read_csv函数非常适合读取csv文件,并为您提供了许多参数来跳过行,省略字段等。

import pandas as pd

tmp_data=pd.read_csv('file.csv',sep=';')
#ensure fields are named~ID,Product_ID,Name,Ratio,Description
#concatenate name and Product_id to make a new field a la Dr.Dee's answer
products = [
    Product(
        name = tmp_data.ix[row]['Name'] 
        description = tmp_data.ix[row]['Description'],
        price = tmp_data.ix[row]['price'],
    )
    for row in tmp_data['ID']
]
Product.objects.bulk_create(products)

我正在使用mmrs151的答案,但保存每一行(实例)非常慢,并且包含分隔字符(甚至在引号内)的任何字段都不是由open() - line.split(';')方法处理的。

熊猫有很多有用的警告,值得了解


对于使用的django 1.8,

我做了一个命令,你可以在将来动态创建对象,所以你只需要放置csv的文件路径,模型名称和相关django应用程序的应用程序名称,它将填充相关模型而不指定字段名。 所以如果我们以下一个csv为例:

field1,field2,field3
value1,value2,value3
value11,value22,value33

它将为您输入命令的模型名称创建对象[{field1:value1,field2:value2,field3:value3},{field1:value11,field2:value22,field3:value33}]。

命令代码:

from django.core.management.base import BaseCommand
from django.db.models.loading import get_model
import csv


class Command(BaseCommand):
    help = 'Creating model objects according the file path specified'

    def add_arguments(self, parser):
        parser.add_argument('--path', type=str, help="file path")
        parser.add_argument('--model_name', type=str, help="model name")
        parser.add_argument('--app_name', type=str, help="django app name that the model is connected to")

    def handle(self, *args, **options):
        file_path = options['path']
        _model = get_model(options['app_name'], options['model_name'])
        with open(file_path, 'rb') as csv_file:
            reader = csv.reader(csv_file, delimiter=',', quotechar='|')
            header = reader.next()
            for row in reader:
                _object_dict = {key: value for key, value in zip(header, row)}
                _model.objects.create(**_object_dict)

请注意,可能在以后的版本中

from django.db.models.loading import get_model

已弃用,需要更改为

from django.apps.apps import get_model




export