完成DRF初学者在这里..。我对以下概念感到困惑:
编辑:我的用例是一个API帖子,在其中一个字段中包含一个复杂的JSON blob。我需要解析JSON字段,验证它,基于它获取/创建几个对象,链接新的和现有的对象,最后将JSON字段存储在其中一个新对象中。因此,我需要对这个JSON字段进行自定义验证,方法是将它解析为python:
from django.utils.six import BytesIO
from rest_framework.parsers import JSONParser
class MySerializer(serializers.ModelSerializer):
my_json_field = JSONSerializerField()
def validate_my_json_field(self, value):
stream = BytesIO(value)
list_of_dicts = JSONParser().parse(stream)
# do lots of validation to list_of_dicts
# render list_of_dicts back to a JSON string
return validated_list_of_dicts_as_json现在,根据我在概念1中选择的方式,我必须再次解析验证过的JSON,以便在create()中创建我的对象,这感觉不太正确。
提前感谢!
发布于 2015-08-04 05:15:43
HTTP请求(POST、GET、PUT、DELETE)的内容将始终由视图(View、APIView、generic、viewset)处理。序列化程序只是这些视图处理请求的一部分。序列化器是将视图层与模型层连接起来的“手段”。关于序列化器具体做什么,请阅读官方文档的这个页面的第一段。
回答#1:除非您有一个非常具体的用例,否则您几乎总是不需要触摸任何一个。在这些特殊情况下:
Serializer.create(),反之亦然。(例如创建多个对象)ViewSet.create()。(例如,如果请求中有额外的查询参数,添加一些响应头)要回答#2,您几乎不需要在使用泛型视图或is_valid()时使用ViewSets。他们已经为你做过了。序列化程序的.data和.validated_data解释起来有点棘手。前者包含要序列化的queryset/model实例的Python数据类型表示,而后者是检查Python对象是否符合前面提到的特定Python数据类型表示的验证过程的结果,而后者又可以转换为模型实例。如果这没有意义,请参考序列化对象和反序列化对象。
至于#3,您所说的JSON字段是什么意思?据我所知,Django没有一个名为JSONField的模型字段。这是来自第三方包还是您自己定制的书面模型字段?如果是这样的话,那么您可能需要找到或编写一个包,使您能够顺利地将其与DRF集成,并“正确地”使用它。
编辑
用例太复杂了。我只能给你这个粗略的代码。
class MyModelSerializer(serializers.ModelSerializer):
my_json_field = JSONSerializerField()
class Meta:
model = MyModel
def validate(self, data):
# Get JSON blob
json_blob = data['my_json_field']
# Implement your own JSON blob cleanup method
# Return None if invalid
json_blob = clean_json_blob(json_blob)
# Raise HTTP 400 with your custom error message if not valid
if not json_blob:
raise serializers.ValidationError({'error': 'Your error message'})
# Reassign if you made changes and return
data['my_json_field'] = json_blob
return data
def create(self, validated_data):
json_blob = validated_data['my_json_field']
# Implement your object creation here
create_all_other_objects_from_json(json_blob)
# ...
# Then return a MyModel instance
return my_modelhttps://stackoverflow.com/questions/31798912
复制相似问题