2009-10-09 49 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")