我制作了一个通用外键,能够以通用的方式在报表模型中引用任何类型(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的所有报告。 你能救我吗?
答案 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不是普通的字段对象,所以这些示例不起作用: