2013-05-11 6 views
1

я сделал следующее в моем model.py сгенерировать уникальный идентификатор для него:Правильно Создание уникального идентификатора для Django модели

12 def rand_key(size): 
13  return ''.join([random.choice(string.letters + string.digits) for i in range(size)]) 
14 
15 
16 class Share(models.Model): 
17 
20  resource_content_type = models.ForeignKey(ContentType) 
21  resource_object_id = models.PositiveIntegerField() 
22  resource_content_object = generic.GenericForeignKey('resource_content_type', 'resource_object_id') 
23 
24  identifier = models.CharField(max_length=16,unique=True,default=rand_key(16)) 

Дело в том, что при попытке сохранить последовательно две записи, сообщение об ошибке duplicate key value violates unique constraint "share_share_identifier_key" поп вверх. Я уверен, что это обычная функция.

Что я делаю неправильно?

Благодаря

Edit: Позвольте мне просто добавить первую запись создается без каких-либо проблем и поле идентификатора имеет propoerly «случайное» значение. Является ли в битве второй записи, которая происходит в результате столкновения. Кажется, что функция rand_key каким-то образом кэшируется.

ответ

4

Проблема в том, что вы назначаете выход случайной функции аргументу по умолчанию. Тогда значение будет одинаковым для всех записей. Попробуйте этот код

def rand_key(size): 
    return ''.join([random.choice(string.letters + string.digits) for i in range(size)]) 


class Share(models.Model): 
    resource_content_type = models.ForeignKey(ContentType) 
    resource_object_id = models.PositiveIntegerField() 
    resource_content_object = generic.GenericForeignKey('resource_content_type', 'resource_object_id') 
    identifier = models.CharField(max_length=16, unique=True) 

    def save(self, force_insert=False, force_update=False, using=None, 
     update_fields=None): 
     if self.identifier is None: 
      self.identifier = rand_key(16) 
     models.Model.save(self, force_insert, force_update, using, update_fields) 

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

1

Пара поправок к ответу Мухаммеда K K (прокомментировал, но не разрешил). Это переопределяет метод сохранения моделей и добавит уникальный идентификатор, когда модель будет сохранена в первый раз.

def save(self, force_insert=False, force_update=False, using=None, 
     update_fields=None): 
     if self.identifier is None or len(self.identifier) == 0: 
      self.identifier = rand_key(16) 
     models.Model.save(self, force_insert, force_update, using, update_fields) 

Мне нужно было передать себя в качестве первого аргумента для сохранения и проверить, что идентификатор был либо пустой, либо пустой. Я не знаю, что вызывает эти различия, или если его ответ не предназначен для использования vertatim ... Я использую Django 1.6 и python 2.6.

Смежные вопросы