python / django для создания цикла базы данных, заполненной 0000-9999 - PullRequest
0 голосов
/ 09 октября 2009

По сути, я создал представление, чтобы заполнить свою базу данных последовательными моделями от 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)

Ответы [ 4 ]

1 голос
/ 09 октября 2009

Могут быть позиционные аргументы по умолчанию, попробуйте использовать ключевые слова:

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'

Это завернуто в транзакции, должно немного ускорить его. Подробнее см. транзакции.commit_manually

1 голос
/ 09 октября 2009

Ваш код работает на моем сайте - Mac OS X, Python 2.6.3, django из trunk, 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")
0 голосов
/ 13 октября 2009

Ваше поле идентификатора (подразумеваемое отсутствием определения PK в вашей модели) не нумеруется автоматически, и поэтому каждый INSERT после первого завершается с ошибкой с дублированным значением идентификатора. Какая у вас база данных? Джанго создал таблицу или сам сделал это?

0 голосов
/ 09 октября 2009

Попробуйте добавить unique=False в объявлении поля closed.

Кроме того, вы пытаетесь поместить целые числа в строковое поле. Вы должны сделать это как Serial('%04d' % i, False), чтобы установить значения от '0000' до '9999'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...