【发布时间】:2015-06-01 07:56:48
【问题描述】:
我正在从 2.4 升级到 DRF3.1.1。我正在使用自定义序列化程序来创建不是模型的对象的实例。
在 2.4 中,这样做很容易,因为在序列化程序中,我会在 restore_object() 中创建对象。在视图中,我会调用serializer.is_valid(),然后使用serializer.object 将对象的实例从序列化程序中弹出。然后我就可以为所欲为。
随着 3.x 的变化,从对象中取出实例变得更加困难,因为创建和更新方法应该进行保存,而“serializer.object”不再可用。
作为一个例子,我曾经为我的“UserRegistration”对象设置了这个。这不是一个模型,因为它是服务器解析并将数据存储在许多其他对象/数据库表中的便利对象。
class UserRegistration(object):
def __init__(self, full_name, stage_name, password="", email="", locale="en_US"):
self.full_name = full_name
self.password = password
self.locale = locale
self.email = email
self.stage_name = stage_name
以下是相关的 DRF-2.4 序列化程序:
class UserRegistrationSerializer(serializers.Serializer):
full_name = serializers.CharField(max_length=128, required=False)
stage_name = serializers.CharField(max_length=128)
password = serializers.CharField(max_length=128, required=False)
locale = serializers.CharField(max_length=10, required=False)
# use CharField instead of EmailField for email. We do our own validation later to make for a better error msg.
email = serializers.CharField(max_length=254, required=False)
def restore_object(self, attrs, instance=None):
if instance is not None:
instance.full_name = attrs.get('full_name', instance.full_name)
instance.password = attrs.get('password', instance.password)
instance.locale = attrs.get('locale', instance.locale)
instance.email = attrs.get('email', instance.email)
instance.stage_name = attrs.get('stage_name', instance.stage_name)
return instance
return UserRegistration(**attrs)
然后在我看来,我会做这样的事情:
class UserRegistration(APIView):
throttle_classes = ()
serializer_class = UserRegistrationSerializer
def post(self, request, format=None):
event_type = "user_registration"
serializer = UserRegistrationSerializer(data=request.DATA, context={'request': request})
try:
if serializer.is_valid():
user_registration = serializer.object
# save user_registration pieces in various places...
然而,在 DRF3 中,我 serializer.object 消失了。文档说要使用serializer.validated_data 进行“验证”,但这只是一个哈希值,而不是真正的对象。有没有办法获取对象?
整个事情似乎更符合 DB 对象,在这种特殊情况下,这正是我想要避免的。
我只是错过了一些新的 DRF3 概念吗?
【问题讨论】:
标签: python django serialization django-rest-framework