[英]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.