我对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?如果是这样,他们为什么不在过滤器示例中使用它?
答案 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开始,查看各种关系。