Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django创建和修改的猴子补丁_Python_Django_Monkeypatching - Fatal编程技术网

Python django创建和修改的猴子补丁

Python django创建和修改的猴子补丁,python,django,monkeypatching,Python,Django,Monkeypatching,我在一年前部署了一个应用程序。在生产中,我不愿意手动更改所有模型,以添加由创建的和由修改的字段,因为这样做风险不大 不管怎么说,我们可以用更少的代码来实现它,我们可以修复它(至少对于未来的事务,它应该将这些字段添加到每个模型中?) 我想用猴子来修补它,但不知道如何实现它 from django.apps import apps from django.db import models from django.contrib.auth import get_user_model model_li

我在一年前部署了一个应用程序。在生产中,我不愿意手动更改所有模型,以添加由创建的
和由
修改的
字段,因为这样做风险不大

不管怎么说,我们可以用更少的代码来实现它,我们可以修复它(至少对于未来的事务,它应该将这些字段添加到每个模型中?)

我想用猴子来修补它,但不知道如何实现它

from django.apps import apps
from django.db import models
from django.contrib.auth import get_user_model

model_list = apps.get_models()
#-- Monkey Patch


for model in model_list:
  if model != get_user_model():
    model.add_to_class('created_by', models.CharField(max_length=250,blank=True, null=True))
    model.add_to_class('modified_by', models.CharField(max_length=250,blank=True, null=True))

        
  def save(self):
      if self.pk:
          self.created_by = request.user.id #not sure, how I would get the user here from request 
          self.modified_by = request.user.id
      return super(model, self).save(*args, **kwargs)

  model.add_to_class("save", save)

可以考虑包含这些字段的基础抽象模型并从中继承其他模型。但不确定它将如何与迁移一起工作。

我认为最好的方法是使用这两个字段创建一个抽象类,并在每个类中继承它。唯一需要记住的是,您需要为它们提供初始值:

类用户操作(models.Model):
创建人=models.ForeignKey(用户,在删除=models.SET时为空,空白=True,空=True)
已修改用户=models.ForeignKey(用户,在删除=models.SET时为NULL,空白=True,NULL=True)
类元:
抽象=真
#从UserAction类继承
类MyClass(用户操作):
# ... 领域