2016-09-27 3 views
0

Вот моя модельUUIDField не имеет атрибута uuid4

from django.contrib.contenttypes.fields import GenericForeignKey 
from django.contrib.contenttypes.models import ContentType 
import uuid 

class PiO(models.Model): 
    uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) # surrogate 
    person = models.ForeignKey(Person, on_delete=models.PROTECT, max_length=25, blank=True) 
    content_type = models.ForeignKey(ContentType, on_delete=models.PROTECT) # for the various organization types 
    object_id = models.UUIDField(primary_key=False, default=uuid.uuid4, editable=False) # the uuid of the specific org 
    content_object = GenericForeignKey('content_type', 'object_id') 

Вот мой отслеживающий

AttributeError: 'UUIDField' object has no attribute 'uuid4'. 

ПримечаниеЭтот специально ссылающийся на object_id поле, не (рк) поле UUID. В качестве теста я прокомментировал поле object_id. Я сделал не получить сообщение об ошибке, поскольку не имеет поля object_id, и проверка перешла к новой ошибке на 12 строк.

Я гугл точной фразы и получил

No results found for "AttributeError: 'UUIDField' object has no attribute 'uuid4'". 

То, что я сделал вид в соответствии с the docs мне.

Что мне не хватает? Имеет ли наличие общего внешнего ключа и/или типа контента какое-либо отношение к нему?

ответ

5

Проблема в том, что поле модели uuid сталкивается с модулем uuid.

Одним из вариантов было бы переименовать модель поля, например:

class PiO(models.Model): 
    id = models.UUIDField(primary_key=True, default=uuid4, editable=False) 
    ... 

Другим вариантом было бы изменить импорт в from uuid import uuid4 и обновлять по умолчанию использовать uuid4 вместо uuid.uuid4.

from uuid import uuid4 

class PiO(models.Model): 
    uuid = models.UUIDField(primary_key=True, default=uuid4, editable=False) # surrogate 
    ... 
    object_id = models.UUIDField(primary_key=False, default=uuid4, editable=False) # the uuid of the specific org 
+0

Спасибо. И Sayse для начального комментария, который помог мне и, может быть, стоил ему некоторых очков ;-). Всего несколько вещей. Мне нужно вернуться и реорганизовать мой код, потому что я назвал много pk-полей «uuid». Не конец света. Кроме того, когда я заменил uuid на id как имя поля, он стал синим (тот же цвет, что и «класс» в моей теме Sublime), который был «красным флагом». См. Https://docs.djangoproject.com/en/1.10/topics/db/models/#automatic-primary-key-fields и http://stackoverflow.com/questions/77552/id-is-a-bad- variable-name-in-python. Поэтому я решил просто изменить их все на uuid_ –

+0

UPDATE для всех, у кого есть эта проблема. Хотя Python позволяет uuid_, Django этого не делает, поэтому вам нужно выяснить другое имя. –

+0

Django позволяет поля модели с ведущими подчеркиваниями, например. '_uuid', но не завершающие подчеркивания, например. 'Uuid_'. Сказав это, я не понимаю, почему вы должны найти другое имя. Если вы измените импорт, вы можете сохранить 'uuid'. Кроме того, вы можете просто использовать 'id'. Django использует 'id' для автоматически сгенерированных первичных ключей, поэтому вы также можете использовать его. Я понимаю, что ваш редактор показывает предупреждение, но в этом случае можно игнорировать. – Alasdair

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