Django - 如何引用通用外键中的特定类型?

时间:2012-11-24 22:30:58

标签: django django-models generic-foreign-key


我制作了一个通用外键,能够以通用的方式在报表模型中引用任何类型(A或B)的模型。
它工作正常但我的问题是,现在,我需要进行查询以检索引用特定类型的模型的所有Report实例(例如,所有带有foreign_key引用类A的Report)。我试图访问数据库中的content_type但显然不可能(变量不存在......)
这是我的模特:

class Report(models.Model):
  content_type = models.ForeignKey(ContentType)
  object_id = models.CharField(max_length=50)
  reported_item = generic.GenericForeignKey('content_type', 'object_id')

class A(models.Model):
  reports = generic.GenericRelation(Report)

class B(models.Model):
  reports = generic.GenericRelation(Report)

你知道怎么做吗? 为了防止它发生任何变化,我将mongoDB用于我的数据库 非常感谢!

编辑:
当我在数据库中显示报表对象时,结果如下:

db.website_report.findOne()
{
"_id" : ObjectId("50afa903a96c5c2f63000001"),
"content_type_id" : ObjectId("50afa903a96c5c2f63000000"),
"object_id" : "50afa8a8a96c5c2f53000001",
}

正如您所看到的,数据库的内容与我的模型没有任何相似之处,因此我不知道如何进行查询以获得具有A的foreign_key的所有报告。 你能救我吗?

3 个答案:

答案 0 :(得分:3)

我不明白为什么你认为db不能反映你的模型。你有内容类型引用和对象id。你需要vdo的所有内容都是找出你的模型A所指的内容类型,contenttype documentation中对此进行了解释:

ct = ContentType.objects.get_for_model(A)
objs = Report.objects.filter(content_type=ct)

答案 1 :(得分:0)

这是我的一个项目中的一个示例类,它显示了某些模型和使用Q对象的应用程序的限制

class ContainerItem(models.Model) :
    """Items for containers"""
    limit = models.Q(model="page") & (models.Q(app_label='events') | models.Q(app_label='press')) & ~models.Q(app_label='press', model='category')
    object_type = models.ForeignKey(ContentType, limit_choices_to=limit)
    object_id = models.IntegerField(db_index=True)
    object = generic.GenericForeignKey(
        ct_field = "object_type", 
        fk_field = "object_id"
    )

答案 2 :(得分:-1)

Filtering on GenericForeignKeys is not possible:

  

由于GenericForeignKey的实现方式,您不能通过数据库API直接将这些字段用于过滤器(例如filter()和exclude())。因为GenericForeignKey不是普通的字段对象,所以这些示例不起作用: