2017-04-10 722 views
0

我想導入一些CSV數據到一個postgresql數據庫使用Django導入導出。我使用python 3.4,django 1.8.1和導入導出0.5.1。嘗試導入csv使用django導入導出導出結果tablib.core.InvalidDimensions

我的設置文件有以下指令:

IMPORT_EXPORT_USE_TRANSACTIONS = True 

我的模型有10個領域。 Postgresql自動增加第11個字段,即id。

class BankTransaction(models.Model): 
    tacct  = models.ForeignKey(MetaAcct,on_delete=models.CASCADE) 
    tdate  = models.DateTimeField('tdate') 
    tctpty = models.ForeignKey(Counterparty,on_delete=models.CASCADE) 
    TRANSACTOR_CHOICES = (
     ('XXX', 'transactor1'), 
     ('YYY', 'transactor2'), 
    ) 
    tuser  = models.CharField(max_length=3,choices=TRANSACTOR_CHOICES,default="LMH") # eg LMH 
    trec  = models.IntegerField(default=0, blank=True) 
    tnote  = models.CharField(default='',max_length=50, blank=True) 
    tcheckno = models.IntegerField(default=0, blank=True, null=True) 
    ttype  = models.ForeignKey(TransactionType,on_delete=models.CASCADE) 
    tamt  = models.DecimalField(max_digits=10, decimal_places=2) 
    tmemo  = models.CharField(default='',max_length=20, blank=True) 

    def __str__(self): 
     label = str.join(',',(str(self.tacct),str(self.tctpty))) 
     return label 

在admin.py我白名單8個字段,包括id字段:

from django.contrib import admin 
from import_export import resources 

from .models import MetaAcct,Counterparty,TransactionType,BankTransaction 

admin.site.register(MetaAcct) 
admin.site.register(Counterparty) 
admin.site.register(TransactionType) 
admin.site.register(BankTransaction) 

class MetaAcctResource(resources.ModelResource): 

    class Meta: 
     model = MetaAcct 

class BankTransactionResource(resources.ModelResource): 

    class Meta: 
     model = BankTransaction 
     fields = ('id','tacct','tdate','tctpty','tuser','trec','ttype','tamt') 

我的shell命令來的權利,讀最文檔的:

>>> import tablib 
>>> from import_export import resources 
>>> from mny.models import BankTransaction 
>>> banktransaction_resource = resources.modelresource_factory(model=BankTransaction)() 
>>> dataset = tablib.Dataset(['','/Users/userid/Downloads/pa upload/test.csv'], headers=['id','tacct','tdate','tctpty','tuser','trec','ttype','tamt']) 

文件我試圖導入test.csv,如下所示:

id,tacct,tdate,tctpty,tuser,trec,ttype,tamt 
,test,2015-01-13 0:00:00,TEST_ACCT,XXX,20151031,xfer,20000 
,test,2015-01-31 0:00:00,BANK_ACCT,XXX,20151031,Int Inc,0.09 
,test,2015-11-30 0:00:00,BANK_ACCT,XXX,20151130,Int Inc,1.49 
,test,2015-12-17 0:00:00,TEST_ACCT,XXX,20151231,xfer,12000 
,test,2015-12-31 0:00:00,BANK_ACCT,XXX,20151231,Int Inc,0.2 
,test,2016-01-31 0:00:00,BANK_ACCT,XXX,20160131,Int Inc,0.24 
,test,2016-02-29 0:00:00,BANK_ACCT,XXX,20160229,Int Inc,0.23 
,test,2016-03-31 0:00:00,BANK_ACCT,XXX,20160331,Int Inc,0.25 
,test,2016-04-08 0:00:00,TEST_ACCT,XXX,20160427,xfer,-6000 
,test,2016-04-30 0:00:00,BANK_ACCT,XXX,20160430,Int Inc,0.2 
,test,2016-05-31 0:00:00,BANK_ACCT,XXX,20160531,Int Inc,0.2 
,test,2016-06-30 0:00:00,BANK_ACCT,XXX,20160630,Int Inc,0.19 
,test,2016-07-31 0:00:00,BANK_ACCT,XXX,20160731,Int inc,0.2 
,test,2016-08-31 0:00:00,BANK_ACCT,XXX,20160831,Int Inc,0.2 
,test,2016-09-30 0:00:00,BANK_ACCT,XXX,20160930,Int Inc,0.19 
,test,2016-10-31 0:00:00,BANK_ACCT,XXX,20161031,Int Inc,0.2 
,test,2016-11-30 0:00:00,BANK_ACCT,XXX,20161130,Int Inc,0.19 
,test,2017-01-30 0:00:00,TEST_ACCT,XXX,20170131,xfer,15000 
,test,2017-01-31 0:00:00,BANK_ACCT,XXX,20170131,Inc Inc,0.21 

這裏是回溯:

Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "/Users/userid/Documents/django/testenv/lib/python3.4/site-packages/tablib/core.py", line 169, in __init__ 
    self.headers = kwargs.get('headers') 
    File "/Users/userid/Documents/django/testenv/lib/python3.4/site-packages/tablib/core.py", line 338, in _set_headers 
    self._validate(collection) 
    File "/Users/userid/Documents/django/testenv/lib/python3.4/site-packages/tablib/core.py", line 286, in _validate 
    raise InvalidDimensions 
tablib.core.InvalidDimensions 

因爲測試的,在數據​​庫模型最新的ID是21,那麼下一個自動增量應該是22

回答

0

它看起來好像你可能會使用tablib Dataset對象不正確。試試這個...

tablib.Dataset(headers=['id','tacct','tdate','tctpty','tuser','trec','ttype','tamt'])\ 
    .load(open('/Users/userid/Downloads/pa upload/test.csv').read()) 

查看tutorial查看其他示例。

+0

謝謝。你的建議使我能夠用我的test.csv文件填充一個tablib數據集對象。也感謝您向我介紹tablib教程。現在我必須弄清楚什麼是阻止數據到達數據庫。這可能是一個進出口問題。 – LMHudson