繁体   English   中英

在Django中记录实例更改的通用方法

[英]General Approach for logging instance change in Django

我想将实例更改记录在Django项目中。 我知道,在django管理员中,django有一个历史记录表,用于记录例如每个单独的更改,但是我想要一个自定义的日志模型。

我以前的模型如下所示:

class MyLog(models.Model):
    a = models.ForeingKey(A, on_delete = models.SET_NULL)
    b = models.ForeingKey(B, on_delete = models.SET_NULL)
    c = models.ForeingKey(C, on_delete = models.SET_NULL)
    change = models.CharField(amx_length=256)

除一种情况外,此方法有效,删除实例。 例如,如果删除实例“ A”,则引用该实例的所有日志的字段“ a”都将设置为“无”,那么该日志将无用。

我想我应该改为执行以下操作:

class MyLog(models.Model):
    a = models.IntegerField()
    b = models.IntegerField()
    c = models.IntegerField()
    change = models.CharField(amx_length=256)

缺点是日志和它尝试记录的项目之间没有明确的关系,但是我不再失去任何有价值的信息。 这似乎是Django在历史记录表中记录实例更改的方式。

我的问题是,这是正确的方法吗? 还是这样做还有其他缺点?

Django提供了许多审核跟踪程序包 您是否需要将更改作为单个文本字段进行跟踪(您有max_length的错字,如果您确实想走这条路线,我还是将其设为TextField )吗? 使用这些软件包的好处是可以保持更好的封装并提供更大的灵活性。

针对您关于无法执行删除操作的投诉,您可以尝试使用pre_delete信号。 您是否通常使用信号来表示这种行为? 那将是最好的方法。

从关系的角度来看,应使用A删除日志以维护ForeignKey的完整性。

您不应该具有要保留的模型日志,该模型要使用不想保留的对象的外键来保存。

这种方法(使用整数)的缺点是您没有利用关系数据库提供给您的数据完整性。

您可能想要的是不从数据库中删除A,而是在其上带有一个标志,其状态在用户"deleted"时会变为"deleted"

另一种方法是不要将日志放在关系数据库上。 如果您不需要保持这种关系(例如,如果您不需要向用户展示),那么这是合理的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM