2015-02-09 6 views
0

Не уверен, что это ошибка в Django, или она просто не поддерживает то, что я пытаюсь сделать (или как я это делаю).Django Auto UUID в модели не уникален

Отрывок из моей модели:

class UserProfile(models.Model): 
    user = models.OneToOneField(User, primary_key=True, related_name='profile' 
    login_hash = models.CharField(max_length=36, blank=True, null=True, default=uuid.uuid4()) 
    ... 

Как вы видите, я уже установлен по умолчанию для login_hash для вызова uuid.uuid4()

работает отлично ... Однако, несколько вызовов UserProfile (создание новых пользователей быстро, даже вроде бы несколько минут, но я не официальный) приведет к тому же login_hash для нескольких пользователей.

Похоже, что django (i'm on 1.7.4) кэширует результат uuid4() в течение некоторого периода времени. не хорошо для того, что я пытаюсь сделать.

РЕШЕНИЕ: , что я использую. Я просто установил триггер «on insert» в базе данных, поэтому, когда я вставляю новую запись, база данных генерирует UUID, но только на вставках/новых записях.

Есть ли способ сделать это в django, чтобы я мог сохранить базу данных агностикой?

ответ

7

работает отлично ... Однако, несколько звонков в UserProfile (создание новых пользователей быстро, даже, казалось бы, несколько минут, но я не официальное времени) приведет к тому же login_hash для нескольких пользователей.

Поскольку код в настоящее время написан, вы звоните uuid.uuid4() в пункт UserProfile. Он будет вызываться один раз, и итоговое значение будет по умолчанию для всех новых созданий.

Что вам вместо этого нужно передать по умолчанию. Например: default=uuid.uuid4.

Кроме того, для CharField Я настоятельно рекомендую не допускать значений NULL, а также пустых значений. Также неясно, действительно ли вы хотите разрешить пустые значения для этого поля, но давайте предположим, что вы это делаете. Вы должны в итоге:

login_hash = models.CharField(max_length=36, blank=True, default=uuid.uuid4) 
+0

«шлепнуть лоб» ... конечно ... ненавидят его, когда пара подтягивает беспорядки :) Спасибо! –

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