我正在查看Tutorials中的序列化器(serializers.Serializer
,而不是serializers.ModelSerializer
),我对一件事感到困惑。
首先,我们将数据序列化为Python本机数据类型:
>>> snippet = Snippet(code="print('hello' + ' world'\n)")
>>> snippet.save()
>>> serializer = SnippetSerializer(snippet)
>>> serializer.data
{'style': 'friendly', 'code': "print('hello' + ' world'\n)", 'language': 'python', 'title': '', 'pk': 2, 'linenos': False}
这里的问题是,我们没有在语言或样式字段中发送任何选择字段选项。
如果我们看一下
serializer
对象,那么它包括我们所有的选择:>>> serializer
SnippetSerializer(<Snippet: Snippet object>):
pk = IntegerField(read_only=True)
title = CharField(allow_blank=True, max_length=100, required=False)
code = CharField(style={'base_template': 'textarea.html'})
linenos = BooleanField(required=False)
language = ChoiceField(choices=[('abap', 'ABAP'), ('abnf', 'ABNF'), ('ada', 'Ada'), ('adl', 'ADL'), ('agda', 'Agda'), ('ahk', 'autohotkey'), ('alloy', 'Alloy'), ('antlr', 'ANTLR'), ('antlr-as', 'ANTLR With ActionScript Target'), ('antlr-cpp', 'ANTLR With CPP Target'), ('antlr-csharp', 'ANTLR With C# Target'), ('antlr-java', 'ANTLR With Java Target'), ('antlr-objc', 'ANTLR With ObjectiveC Target'), ('antlr-perl', 'ANTLR With Perl Target'), ('antlr-python', 'ANTLR With Python Target'), ('antlr-ruby', 'ANTLR With Ruby Target'), ('apacheconf', 'ApacheConf'), ('apl', 'APL'), ('applescript', 'AppleScript'), ('arduino', 'Arduino'), ('as', 'ActionScript'), ('as3', 'ActionScript 3'), ('aspectj', 'AspectJ'), ('aspx-cs', 'aspx-cs'), ('aspx-vb', 'aspx-vb'), ('asy', 'Asymptote'), ('at', 'AmbientTalk'), ('autoit', 'AutoIt'), ('awk', 'Awk'), ('basemake', 'Base Makefile'), ('bash', 'Bash'), ('bat', 'Batchfile'), ('bbcode', 'BBCode'),....
所以我的问题是,为什么我们不发送
serializer
对象。为什么只发送不包含选择选项的serializer.data
。客户端如何知道必须选择哪些选项?对于客户端适合本教程的地方,我也可能会感到困惑。对于我的工作方式,还没有完全了解。
最佳答案
选项方法
OPTIONS方法允许客户端确定与资源相关联的选项和/或要求或服务器的功能,而无需暗示资源操作或启动资源检索。
— RFC7231,第4.3.7节。
如果希望JS在该资源上具有meta information,则可能要实现OPTIONS方法,让JS处理返回的元数据,然后调整表单以创建新实例。
如果您遵循上面链接的Django REST Framework文档,则可以自定义元数据中返回的内容以满足您的需求。
关于python - Django REST框架-教程-困惑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37751866/