在Django模型中使用UUID作为主键(通用关系影响)

由于多种原因^,我想在某些Django模型中使用UUID作为主键。如果这样做,我仍然可以使用通过ContentType使用通用关系的外部应用程序,例如“ contrib.comments”,“ django-voting”或“ django-tagging”吗?

以“ django-voting”为例,Vote模型如下所示:

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)

该应用似乎假设要投票的模型的主键是整数。

内置的注释应用程序似乎能够处理非整数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感到痛苦?或者,可能是我误读了这种情况?

有没有一种方法可以将UUID用作Django中的主键,而又不会造成太多麻烦?

^一些原因:隐藏对象计数,防止url“ id爬行”,使用多个服务器创建不冲突的对象,…

回答:

从文档中可以看出,从Django 1.8开始,有一个内置的UUID字段。使用UUID与整数时的性能差异可以忽略不计。

import uuid

from django.db import models

class MyUUIDModel(models.Model):

id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)

以上是 在Django模型中使用UUID作为主键(通用关系影响) 的全部内容, 来源链接: utcz.com/qa/429464.html

回到顶部