【问题标题】:Django - How to reference a specific type in a generic foreign key?Django - 如何在通用外键中引用特定类型?
【发布时间】:2012-11-24 22:30:57
【问题描述】:


我创建了一个通用外键,以便能够以通用方式引用报表模型中的任何类型(A 或 B)模型。
它工作正常,但我的问题是现在,我需要进行查询以检索所有引用特定类型模型的报告实例(例如,所有具有引用类 A 的外键的报告)。我试图访问数据库中的 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 外键的报告。
你能帮帮我吗?

【问题讨论】:

  • 当您尝试按内容类型查找时,“变量不存在”是什么意思。当然,这就是这样做的方法,因此您应该发布您尝试过的代码,以便我们查看问题所在。

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


【解决方案1】:

我不明白您为什么认为 db 不能反映您的模型。那里有内容类型引用和对象 ID。你需要做的只是找出什么内容类型引用了你的模型 A,这在 contenttype documentation 中有解释:

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

【讨论】:

    【解决方案2】:

    这是我的一个项目中的一个示例类,它显示了某些模型和使用 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"
        )
    

    【讨论】:

      【解决方案3】:

      Filtering on GenericForeignKeys is not possible:

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

      【讨论】:

      • 这个答案与问题无关。
      猜你喜欢
      • 1970-01-01
      • 2015-03-26
      • 2010-09-26
      • 2013-07-17
      • 1970-01-01
      • 2012-07-31
      • 2011-07-05
      • 1970-01-01
      • 2016-06-18
      相关资源
      最近更新 更多