Python Django Rest框架模型序列化程序-处理创建和更新

Python Django Rest框架模型序列化程序-处理创建和更新,python,django,django-rest-framework,django-signals,Python,Django,Django Rest Framework,Django Signals,我的Django数据库中有一些模型。每个模型都是通过DRFAPI创建或更新的。因此,我有序列化程序(针对每个模型)来处理模型上的创建、更新和部分更新 处理的主要部分包括以下操作: def handle(): if created: model.owner = request.user model.other_fields = other fields model.save() else: model.other_fi

我的Django数据库中有一些模型。每个模型都是通过DRFAPI创建或更新的。因此,我有序列化程序(针对每个模型)来处理模型上的创建、更新和部分更新

处理的主要部分包括以下操作:

def handle():
    if created:
        model.owner = request.user
        model.other_fields = other fields
        model.save()
    else:
        model.other_fields = other fields
        model.save()
此外,每当保存模型时,我需要使用
request.user
创建日志条目

Log.objects.create(user=request.user, model=model, created=timezone.now())
我无法使用信号创建日志条目,因为
post\u save
信号没有请求对象

我该怎么处理

  • 我是否应该创建自定义信号,并在每次创建或更新模型时发送该信号
  • 我是否应该调用序列化程序的
    create
    update
    中的函数来记录模型

    • 避免使用信号。最好的方法是

      选项1

      • 在序列化程序的创建和更新中调用函数以记录模型
      但是,请使用mixin

      class LogSerializerMixin(object):
      
         def create_log(self):
             //do logic over here
             // get your request over here using self
             // get your model using self.instance
             Log.objects.create(user=request.user, model=model, created=timezone.now())
      
      然后在序列化程序中

      Serializer1(LogSerializerMixin, serializers.ModelSerializer):
      
          def create(self):
              // creation logic over here
              self.create_log()
      
          def update(self, data):
              // update logic over here
              self.create_log()
      
      另一个序列化程序

      Serializer2(LogSerializerMixin, serializers.ModelSerializer):
      
          def create(self):
              // creation logic over here
              self.create_log()
      
          def update(self, data):
              // update logic over here
              self.create_log()
      
      选项2

      • 重写保存模型方法,并在那里添加日志创建逻辑
          避免使用信号。最好的方法是

          选项1

          • 在序列化程序的创建和更新中调用函数以记录模型
          但是,请使用mixin

          class LogSerializerMixin(object):
          
             def create_log(self):
                 //do logic over here
                 // get your request over here using self
                 // get your model using self.instance
                 Log.objects.create(user=request.user, model=model, created=timezone.now())
          
          然后在序列化程序中

          Serializer1(LogSerializerMixin, serializers.ModelSerializer):
          
              def create(self):
                  // creation logic over here
                  self.create_log()
          
              def update(self, data):
                  // update logic over here
                  self.create_log()
          
          另一个序列化程序

          Serializer2(LogSerializerMixin, serializers.ModelSerializer):
          
              def create(self):
                  // creation logic over here
                  self.create_log()
          
              def update(self, data):
                  // update logic over here
                  self.create_log()
          
          选项2

          • 重写保存模型方法,并在那里添加日志创建逻辑
          选项1看起来很棒!选项2不可能,因为模型没有访问请求的权限。@levi:您能解释一下OP(或“我们”)为什么应该避免使用信号吗?你建议一般情况下还是仅针对这种特殊情况避免使用它们?选项1看起来很棒!选项2不可能,因为模型没有访问请求的权限。@levi:您能解释一下OP(或“我们”)为什么应该避免使用信号吗?你建议一般情况下避免使用,还是仅针对这种特殊情况?