【问题标题】:Django Rest Framework ModelSerializers - Handling create and updateDjango Rest Framework ModelSerializers - 处理创建和更新
【发布时间】:2016-10-25 16:51:33
【问题描述】:

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

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

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_save 信号没有请求对象。

我应该如何处理?

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

【问题讨论】:

    标签: python django django-rest-framework django-signals


    【解决方案1】:

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

    选项 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(或“我们”)应该避免使用信号吗?您建议一般避免使用它们,还是仅针对这种特定情况?
    猜你喜欢
    • 2020-11-11
    • 2019-05-29
    • 2015-05-21
    • 2023-03-31
    • 2022-09-23
    • 2014-07-25
    • 2016-05-03
    • 2018-01-08
    • 1970-01-01
    相关资源
    最近更新 更多