Django Rest Framework ModelSerializers - 处理创建和更新
Django Rest Framework ModelSerializers - Handling create and update
我的 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
信号没有请求对象。
我该如何处理?
- 我是否应该创建自定义信号并在每次创建或更新模型时发送它?
- 我应该调用序列化程序
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
- 重写保存模型方法,并在那边添加日志创建逻辑。
我的 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
信号没有请求对象。
我该如何处理?
- 我是否应该创建自定义信号并在每次创建或更新模型时发送它?
- 我应该调用序列化程序
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
- 重写保存模型方法,并在那边添加日志创建逻辑。