由于多种原因^,我想在我的一些 Django 模型中使用 UUID 作为主键。如果我这样做,我仍然可以使用通过 ContentType 使用通用关系的外部应用程序,例如“contrib.comments”、“django-voting”或“django-tagging”吗?
以“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)
该应用程序似乎假设正在投票的模型的主键是整数。
不过,内置评论应用程序似乎能够处理非整数 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, ...