【问题标题】:Is it possible to use contenttype with non primary key for the object?是否可以对对象使用具有非主键的内容类型?
【发布时间】:2016-03-15 08:16:51
【问题描述】:

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

我的内容类型模型:

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

【问题讨论】:

    标签: django django-models django-contenttypes


    【解决方案1】:

    简短回答:不,不可能让GenericForeignKey 使用除主键之外的任何其他目标字段。主键在GenericForeignKeyGenericRelation 和一些支持类(内联、相关描述符等)中硬编码。

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

    【讨论】:

    • 可惜还没有参数化。
    • 您如何想象 API 可以自定义 GenericForeignKey 的目标字段是什么?我可以提出两个选项,它们都很丑:要么指定每个模型字段名称覆盖到 GenericForeignKey 本身的字典,这很恶心,因为如果你想为多个模型自定义目标,你会最终得到 GFK 定义中的一大堆洗衣清单;另一种是在GenericRelation 中指定它,这很难看,因为GenericRelation 会改变在其他地方定义的GFK 的行为。
    猜你喜欢
    • 2018-09-06
    • 1970-01-01
    • 2021-09-24
    • 2017-12-16
    • 1970-01-01
    • 2013-01-30
    • 2020-12-28
    • 2016-03-13
    • 1970-01-01
    相关资源
    最近更新 更多