在Django中获取ContentType id以获取泛型关系

时间:2012-10-03 21:10:19

标签: django

我使用旧数据库将项目从Rails移植到Django。在Rails中,我有一个多态关联,允许我在数据库中的任何行添加一个脚注。我试图在Django应用程序中实现相同的功能。我找到了关于通用关系的文档,它看起来很完美。不幸的是,我首先需要在遗留数据库中创建新字段以保存相关模型的ContentType id。我只使用了2个表的多态关联,所以我需要的是Django应用程序中的两个相应的ID,但我似乎找不到在Django中查找ContentType id的相应命令。

欢迎提出任何建议。我试着搜索以前的问题,但似乎无法找到我要找的东西。非常感谢您的时间和帮助。

2 个答案:

答案 0 :(得分:13)

来自https://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/#django.contrib.contenttypes.generic.GenericForeignKey

你可以这样做:

>>> b = Bookmark.objects.get(url='https://www.djangoproject.com/')
>>> bookmark_type = ContentType.objects.get_for_model(b)
>>> TaggedItem.objects.filter(content_type__pk=bookmark_type.id,
...                           object_id=b.id)

所以只需实例化一个模型实例,然后执行ContentType.objects.get_for_model(<instance>).id

我认为还有一种方法可以传递模型名称...让我知道如果这样做会更好,我会试着找到它;我过去曾经用过它。

答案 1 :(得分:5)

您还可以在不创建实例的情况下获取ContentType ID,如果您不需要实例但又不想按型号名称获取ContentType ID,则效率更高。

ContentType.objects.get(model='bookmark').id

注意:如果您的型号名称为大写,请使用小写进行搜索。例如:model =&#39; bookmark&#39;而不是书签&#39;