2009-10-09 39 views
0

基本上,我創建了一個視圖來填充我的數據庫與串行模型從0000到9999。下面是我用於視圖的代碼。python/django循環創建數據庫填充0000-9999

def insert_serials(request): 
    for i in range(0,10000): 
    serial = Serial(i,False) 
    serial.save() 
    else: 
    print 'The for loop is over' 

什麼是做這種正確的方式,我得到一個IntegrityError,重複鍵,我的模型認定中低於:

class Serial(models.Model): 
    serial = models.CharField(max_length=4) 
    closed = models.BooleanField() 

    def __unicode__(self): 
     return "%s" %(self.serial) 

    def get_absolute_url(self): 
     return "/draw/serial/%s/" % (self.serial) 

回答

0

您的id字段(由您的模型中沒有PK定義所暗示)沒有正確自動編號,因此每個INSERT後的第一個INSERT失敗並帶有重複的id值。你的數據庫是什麼?你有Django創建桌子嗎,還是你自己做的?

+0

嗨,我使用mysql和是的,Django創建表使用syncdb和def在models.py – Rasiel 2009-10-13 17:08:01

+0

這個我認爲是問題,我不得不在數據庫上手動分配PK定義。還有另一個代碼問題,但這主要是不會導致for循環在1之後保存 – Rasiel 2009-10-27 06:02:25

0

嘗試在closed字段聲明添加unique=False

此外,你正試圖把整數放入一個字符串字段。您應該像Serial('%04d' % i, False)這樣做,將值從'0000'設置爲'9999'

+0

我這樣做了,但唯一的索引似乎在我的串行字段,所以我從數據庫中刪除索引,它實際上插入9999記錄,但所有0作爲序列,這意味着我總是零。 – Rasiel 2009-10-09 05:18:47

1

有可能是位置默認參數,請嘗試使用關鍵字:

from django.db import transaction 

@transaction.commit_manually 
def insert_serials(request): 
    for i in range(0,10000): 
     serial = Serial(serial=str(i),closed=False) 
     serial.save() 
    transaction.commit() 
    print 'The for loop is over' 

它包裹在一個交易應加快它一點。 見transaction.commit_manually的細節

+0

這給了我一個TransactionManagementError,只能插入一行,顯然我沒有增加,for循環只在1條記錄後結束。 – Rasiel 2009-10-09 05:36:59

+0

奇怪,看起來很簡單。什麼是完整的錯誤? – monkut 2009-10-09 06:29:54

+0

你爲什麼要這樣做?我非常肯定的是,只有在永不執行的情況下才會觸發,這永遠不會發生。 – emeryc 2009-10-12 05:01:52

1

你的代碼工作在我的網站 - 的Mac OS X,Python的2.6.3,從主幹Django的,SQLITE3

我改變您的視圖功能碼了一點,但 -

from django.http import HttpResponse 
from models import Serial 

def insert_serials(request): 
    for i in range(0,10000): 
     serial = Serial(i,False) 
     serial.save() 
    return HttpResponse("Serials are inserted")