【问题标题】:How do I reference different model types from one field in Django?如何从 Django 的一个字段中引用不同的模型类型?
【发布时间】:2014-01-25 18:29:56
【问题描述】:

我有一个代表Log Entry 的模型。每当对数据库进行修改时,就会创建它。

我想包含一个外键字段,它引用 Log Entry 中更改的模型对象。

这样的事情可能吗?

例如:

Log Entry 1

---> Modified Object Field = User Object

但现在不是修改了用户,而是修改了博客...

Log Entry 2

---> Modified Object Field = Blog Object

【问题讨论】:

  • 你最好的猜测是查看 django admin 是如何做同样的事情的。当你登录 django admin 时,你注意到了你的日志,对吧?

标签: python database django django-models


【解决方案1】:

看看GenericForeignKey

普通的 ForeignKey 只能“指向”另一个模型 [...] contenttypes 应用程序 提供了一种特殊的字段类型(GenericForeignKey),它可以解决 这并允许与任何模型建立关系。

【讨论】:

    【解决方案2】:

    这可以使用泛型关系和GenericForeignKey

    https://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/#generic-relations

    请记住,过滤通用外键变得更加复杂(您需要先获取外键内容类型)

    【讨论】:

      【解决方案3】:

      您可以像 Nigel Tufnel 所说的那样使用 GenericForeignKey,但我认为您正在寻找类似 @​​987654322@ 的东西,如果您使用 Django's 代码,您可以看到它使用ForeignKeyContentType 和一条消息:

      class LogEntry(models.Model):
          action_time = models.DateTimeField(_('action time'), auto_now=True)
          user = models.ForeignKey(settings.AUTH_USER_MODEL)
          content_type = models.ForeignKey(ContentType, blank=True, null=True)
          object_id = models.TextField(_('object id'), blank=True, null=True)
          object_repr = models.CharField(_('object repr'), max_length=200)
          action_flag = models.PositiveSmallIntegerField(_('action flag'))
          change_message = models.TextField(_('change message'), blank=True)
      

      【讨论】:

      • 但这就是通用的外来语。实际的类只是在内容类型/对象 id 字段之上添加了一些糖。
      猜你喜欢
      • 2023-02-24
      • 1970-01-01
      • 2019-02-22
      • 1970-01-01
      • 1970-01-01
      • 2019-09-04
      • 1970-01-01
      • 2012-03-12
      • 2011-05-21
      相关资源
      最近更新 更多