如何从Django中的一个字段引用不同的模型类型?

时间:2014-01-25 18:29:56

标签: python database django django-models

我有一个代表Log Entry的模型。只要对数据库进行了修改,就会创建此项。

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

这样的事情可能吗?

例如:

Log Entry 1

---> Modified Object Field = User Object

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

Log Entry 2

---> Modified Object Field = Blog Object

3 个答案:

答案 0 :(得分:4)

看看GenericForeignKey

  

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

答案 1 :(得分:1)

使用通用关系和GenericForeignKey

可以实现

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

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

答案 2 :(得分:0)

您可以使用 Nigel Tufnel GenericForeignKey,但我认为您正在寻找类似Django's admin log的内容,如果您使用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)