Django-记录对模型的更改 我正把一个应用程序从CODENIGITER移植到Django。我想在Django中尝试并重新创建的功能之一是能够记录对模型字段值的任何更改

Django-记录对模型的更改 我正把一个应用程序从CODENIGITER移植到Django。我想在Django中尝试并重新创建的功能之一是能够记录对模型字段值的任何更改,django,Django,放在哪里最好?我试着把它放在模型和表单保存方法中,但目前没有任何运气。有人举过例子吗 基本上: 如果原始emp_名称!=self.emp_名称: ##在变更表中使用旧值、新值和变更日期/时间创建记录 是否可以循环所有ModelForm字段以检查值的更改?我可以为每个字段键入上面的内容,但如果可以在循环中键入则更好。使用信号原则:预保存、后保存、预删除、后删除等等 但是如果是临时的,我更喜欢在settings.py中配置所有查询的日志记录的方式:在settings.py的末尾添加此项,并根据您的

放在哪里最好?我试着把它放在模型和表单保存方法中,但目前没有任何运气。有人举过例子吗

基本上:

如果原始emp_名称!=self.emp_名称: ##在变更表中使用旧值、新值和变更日期/时间创建记录


是否可以循环所有ModelForm字段以检查值的更改?我可以为每个字段键入上面的内容,但如果可以在循环中键入则更好。

使用信号原则:预保存、后保存、预删除、后删除等等

但是如果是临时的,我更喜欢在
settings.py
中配置所有查询的日志记录的方式:在
settings.py
的末尾添加此项,并根据您的需要进行调整:

LOGGING = {
    'disable_existing_loggers': False,
    'version': 1,
    'handlers': {
        'console': {
            # logging handler that outputs log messages to terminal
            'class': 'logging.StreamHandler',
            'level': 'DEBUG',  # message level to be written to console
        },
    },
    'loggers': {
        '': {
            # this sets root level logger to log debug and higher level
            # logs to console. All other loggers inherit settings from
            # root level logger.
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': False, # this tells logger to send logging message
                                # to its parent (will send if set to True)
        },
        'django.db': {
            # django also has database level logging
            'level': 'DEBUG'
        },
    },
}

以下是我如何处理这一问题的,到目前为止效果良好:

# get current model instance to update
instance = MyModel.objects.get(id=id)

# use model_to_dict to convert object to dict (imported from django.forms.models import model_to_dict)
obj_dict = model_to_dict(instance)

# create instance of the model with this old data but do not save it
old_instance = MyModel(**obj_dict)

# update the model instance (there are multiple ways to do this)
MyModel.objects.filter(id=id).update(emp_name='your name') 

# get the updated object
updated_object = MyModel.objects.get(id=id)

# get list of fields in the model class
my_model_fields = [field.name for field in cls._meta.get_fields()]

# get list of fields if they are different
differences = list(filter(lambda field: getattr(updated_object, field, None)!= getattr(old_instance, field, None), my_model_fields))
differences变量将为您提供两个实例之间不同的字段列表。我还发现,添加我不想检查差异的模型字段也很有帮助(例如,我们知道更新的_日期总是会更改的,所以我们不需要跟踪它)


签出此线程以获得良好的起点这是一个相当复杂的主题。除了讨论之外,利夫斯基还指出要确保查看Django软件包上的内容。
skip_diff_fields = ['updated_date']

my_model_fields = []
for field in cls._meta.get_fields():
    if field.name not in skip_diff_fields:
        my_model_fields.append(field.name)