【问题标题】:UUIDField has no attribute uuid4UUIDField 没有属性 uuid4
【发布时间】:2017-02-05 02:42:51
【问题描述】:

这是我的模型

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 (pk) 字段。作为测试,我注释掉了 object_id 字段。我确实没有因为没有 object_id 字段而收到错误,然后检查在 12 行之外又出现了一个新错误。

我搜索了确切的短语并得到了

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

在我看来,我所做的与the docs 一致。

我错过了什么?通用外键和/或内容类型的存在与它有什么关系吗?

【问题讨论】:

    标签: django python-2.7 django-1.9


    【解决方案1】:

    问题是您的模型字段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
    

    【讨论】:

    • 谢谢。并感谢 Sayse 的最初评论,这对我有帮助,可能会让他损失一些分数 ;-)。只是几件事。我必须回去重构我的代码,因为我将很多 pk 字段命名为“uuid”。不是世界末日。此外,当我将 uuid 替换为 id 作为字段名称时,它变成了蓝色(与我的 Sublime 主题中的“class”颜色相同),这是一个“红旗”。请参阅 docs.djangoproject.com/en/1.10/topics/db/models/…stackoverflow.com/questions/77552/… 。所以我决定把它们都改成 uuid_
    • 为遇到此问题的任何人提供更新。虽然 Python 允许 uuid_,但 Django 不允许,所以你必须想出另一个名字。
    • Django 允许带有前导下划线的模型字段,例如_uuid 但后面没有下划线,例如uuid_。话虽如此,我不明白为什么你必须想出另一个名字。如果您更改导入,您可以保留uuid。或者,您可以只使用id。 Django 使用id 作为自动生成的主键,所以你也可以使用它。我知道您的编辑器显示了警告,但在这种情况下可以安全地忽略。
    • 虽然 Django 允许前导下划线,例如_uuid,我不建议这样做。当您进行跨越关系的查找时,您最终会得到三个下划线,例如MyModel.objects.filter(othermodel___uuid=uuid),令人困惑。
    猜你喜欢
    • 1970-01-01
    • 2016-01-27
    • 1970-01-01
    • 2012-12-01
    • 1970-01-01
    • 2011-04-14
    • 2020-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多