Django查询,通用content_types

时间:2009-07-03 14:33:00

标签: django django-models

我对django content_types

有疑问

http://www.djangoproject.com/documentation/models/generic_relations/上为通用内容类型过滤QuerySet的示例中,有以下几行。

ctype = ContentType.objects.get_for_model(quartz)
TaggedItem.objects.filter(content_type__pk=ctype.id, object_id=quartz.id) 

任何人都可以解释content_type__pk的含义吗?

__是否表示存在间接?在过滤器中匹配的左侧上下文中,这意味着什么?

我在模型定义中看到了

content_type = models.ForeignKey(ContentType)

但是当翻译成数据库时,没有名为content_type的字段,但是有一个content_type_id ...所以content_type__pk实际上是否转换为content_type_id?如果是这样,他们为什么不在过滤器示例中使用它?

2 个答案:

答案 0 :(得分:2)

不, TaggedItem 模型有一个ContentType类型的字段,名为 content_type

每个模型都有primary key,您可以通过“pk”来引用它。大多数时候它是“id”字段。但是sometimes it is not

为了保持一致,你可以将id字段称为pk。 所以,当您说过滤器(content_type__pk = ... 时,它类似于过滤器(content_type__id ...

双下划线(__)表示对该模型字段的引用。你可以继续堆叠这些:

Car.objects.filter(category__supercategory__name = "Nice Cars")

如果您的模型Car具有Category的外键,而该类型具有SuperCategory的外键,其具有名为 name 的字段。

如果我错了,任何人都会纠正我。

答案 1 :(得分:0)

如果您不理解Django的双下划线查找符号,则需要在深入研究泛型关系之前阅读查询。这是所有Django查询的基础和基础。在你走路之前不要试着跑。

documentation开始,查看各种关系。