是否可以将contenttype与非主键一起用于对象?

时间:2016-03-15 08:16:51

标签: django django-models django-contenttypes

我会在内容类型对象中使用非主键,如下所示:

我的内容类型型号:

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

我的另一个模特:

class Task(models.Model):
    uid=uid = models.UUIDField(default=uuid.uuid4, unique=True)
    title = models.CharField(_('Title'), max_length=128, help_text=_('Title'))
    votes = GenericRelation(Vote)

现在,架构得到创建,我能够创建对象,但不能检索: 以下不起作用:

t = Task.objects.create(title='task1')
t.votes.all()

我收到以下错误:

django.db.utils.ProgrammingError: operator does not exist: uuid = integer
LINE 1: ..."content_type_id" = 19 AND "vote"."object_uid" = 16) ORDE...

现在我确实理解了这个错误,并且我理解它试图针对uuid评估整数。 有没有办法表明django它应该使用uid字段而不是pk

1 个答案:

答案 0 :(得分:4)

简短回答:不,不可能使GenericForeignKey使用除主键之外的任何其他目标字段。主键在GenericForeignKeyGenericRelation和许多支持类(内联,相关描述符,类似的东西)中进行了硬编码。

如果您确实想要将UUID用作目标字段,那么您必须将UUID字段设置为目标模型上的主键,并使用与UUID兼容的类型Vote.object_id(例如作为CharField,甚至是TextField - 这样你仍然可以指向带有整数主键的模型。)