由于一些原因^,我想在我的一些Django模型中使用UUID作为主键.如果我这样做了,我是否仍然可以使用外部应用程序,如"contri.Comments"、"Django-Voting"或"Django-tagging",这些应用程序通过contentType使用泛型关系?

以"Django-Voting"为例,投票模型如下所示:

class Vote(models.Model):
    user         = models.ForeignKey(User)
    content_type = models.ForeignKey(ContentType)
    object_id    = models.PositiveIntegerField()
    object       = generic.GenericForeignKey('content_type', 'object_id')
    vote         = models.SmallIntegerField(choices=SCORES)

这个应用程序似乎假设正在投票的模型的主键是一个整数.

内置的 comments 应用程序似乎能够处理非整数PK,不过:

class BaseCommentAbstractModel(models.Model):
    content_type   = models.ForeignKey(ContentType,
            verbose_name=_('content type'),
            related_name="content_type_set_for_%(class)s")
    object_pk      = models.TextField(_('object ID'))
    content_object = generic.GenericForeignKey(ct_field="content_type", fk_field="object_pk")

这种"整数PK假设"的问题对于第三方应用程序来说是不是很常见,这会让使用UUID变得很痛苦?或者,可能,我误解了这种情况?

有没有办法在Django中将UUID用作主键而不会造成太多麻烦?


^ Some of the reasons: hiding object counts, preventing url "id crawling", using multiple servers to create non-conflicting objects, ...

推荐答案

UUID主键不仅会导致泛型关系方面的问题,而且还会引起一般效率方面的问题:每个外键的存储和连接成本都要比机器字高得多.

然而,没有什么要求UUID是主键:只需将其设置为secondary键,用UUID字段补充您的模型,将其设置为unique=True.正常使用隐式主键(系统内部),并使用UUID作为外部标识符.

Django相关问答推荐

Django 5.0.2:TypeError:获取切片后无法过滤查询

Django中的InvalidOperation错误[]

dj_rest_auth 中的 PyTest 警告- RemovedInDjango40Warning: django.conf.urls.url() 已弃用,取而代之的是 django.urls.re_path()

有什么方法可以自动设置 Debug True Django application

设置 SECURE_HSTS_SECONDS 可以不可逆转地 destruct 您的网站?

Django中的 联合(Union) 和相交(Intersect)

Django:如何在表单 clean() 方法的 django 验证错误中添加 超链接?

恢复 Django 1.7 RemoveField 迁移

如何在 PyCharm 中重命名 Django 元素?

Django REST Framework - 将额外参数传递给操作

将网络测功机添加到 Heroku django 应用程序时如何克服Coudn't find that formation错误?

创建新内容类型时出错.请确保在try 单独迁移应用程序之前迁移内容类型

如何在 django 元素中开始做 TDD?

使用 get_object_or_404 获取数据库值

在 Django 中使用 LiveServerTestCase 时使用代码登录

django 应用基于条件的样式类

在 django admin 中控制 TextArea 小部件的大小

APIView 类和视图集类之间的区别?

Django REST 框架中的每个字段权限

django用q个对象动态过滤