Django / PostgreSQL与TextField object_id字段的通用关系

时间:2018-04-10 08:11:56

标签: python django postgresql django-orm

我有一个相当基本的Django模型,它具有通用关系:

class AttachedMediaItem(models.Model):

    # Generic relation to another object.
    parent_content_type = models.ForeignKey(
        'contenttypes.ContentType',
        related_name='attachedmediaitem_parent_set', on_delete=models.CASCADE)
    parent_object_id = models.TextField(db_index=True)
    parent_content_object = GenericForeignKey('parent_content_type',
                                              'parent_object_id')

(删除了不相关的字段)

我继承了这个代码库,所以我不能完全证明所有的设计决策,但我相信parent_object_id是一个TextField来支持相关对象的非整数PK(例如UUID)。该模型倾向于涉及各种其他模型,因此它需要在其支持的PK类型方面非常通用。

这是根据Django文档的建议:https://docs.djangoproject.com/en/2.0/ref/contrib/contenttypes/#django.contrib.contenttypes.fields.GenericForeignKey

现在,这个模型:

class UnitType(models.Model):

    media = GenericRelation('media.AttachedMediaItem',
                            content_type_field='parent_content_type',
                            object_id_field='parent_object_id')

(删除了无关字段)。

请注意,我将PK一代留给了Django,这意味着我将获得此模型的整数PK。

现在,如果我运行

UnitType.objects.filter(media__isnull=True) 

SQL错误设法通过ORM冒泡:

ProgrammingError: operator does not exist: integer = text
LINE 1: ...a_attachedmediaitem" ON ("products_unittype"."id" = "media_a...
                                                             ^
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.

我的理解是,这是由于PK字段的不同。

没有将通用对象ID字段类型更改为整数字段(此时不是真正的选项) - 我的选择是什么?这被认为是一个Django错误,还是我错了?

1 个答案:

答案 0 :(得分:2)

事实证明这实际上是一个Django错误。 https://code.djangoproject.com/ticket/16055

它已经7岁了,并没有提供修复。