使用通用外键来检索数据

时间:2014-10-23 15:19:17

标签: python django foreign-keys

我的model.py中有一个类Streams,它应该有另一个类类型的通用外键(CommentdataResponseData

当我得到Streams行时,我想访问具有相同id的另一个类中的数据。例如,当我创建一个Stream db条目时,它还将创建一个具有相同ID的CommentData db条目,该行将具有CommentData的genericforeignkey。当我想访问注释数据时,我将检查该流的相关类,然后查询其中id = Stream.id的行的内容类型

这是我的Streams课程:

limit = models.Q(app_label='picture', model='commentdata') | models.Q(app_label='picture', model='responsedata')`

content_type = models.ForeignKey(ContentType, verbose_name='Data Type', limit_choices_to=limit, null=True, blank=True)

object_id = models.PositiveIntegerField(verbose_name='Related Object', null=True, blank=True)

content_object = GenericForeignKey('content_type', 'object_id')

在django admin中,我可以将Streams内容类型保存到(CommentdataResponseData),这很好。

如果我按照

的方式做某事
x = Streams.objects.all()
y = x[0].content_type

我可以输出与之相关的类流。我不能像y.objects.all()那样做一些事情来获取相关的类,因为我得到了错误

  

无法通过ContentType实例访问管理器

是否有使用ContentType Manager查找此信息? ContentType.objects.get_for_model(x[0])返回班级Stream。同样,ContentType.objects.get_for_model(y)会返回内容类型。

谢谢

1 个答案:

答案 0 :(得分:1)

行。我明白你在做什么。首先,没有办法使用content_types API执行您尝试执行的操作。但它可以做到。

正如你所说:

x = Streams.objects.all() # all stream objects
y = x[0].content_type # CommentData ContentType object

所以你需要像这样使用基本的Django ORM:

from django.db.models.loading import get_model

x = Streams.objects.all() # all stream objects
y = x[0].content_type # CommentData ContentType object
model_class = get_model(app_label=y.app_label, model_name=y.model)

model_class.objects.all() # all objects of the type