Joh*_*ohn 11 django rest angularjs django-rest-framework
我有一个使用Django选择字段的模型,如下所示:
class Question(models.Model):
QUESTION_TYPES = (
(10,'Blurb'),
(20,'Group Header'),
(21,'Group Footer'),
(30,'Sub-Group Header'),
(31,'Sub-Group Footer'),
(50,'Save Button'),
(100,'Standard Question'),
(105,'Text-Area Question'),
(110,'Multiple-Choice Question'),
(120,'Standard Sub-Question'),
(130,'Multiple-Choice Sub-Question')
)
type = models.IntegerField(default=100,choices=QUESTION_TYPES)
Run Code Online (Sandbox Code Playgroud)
我正在使用Django Rest Framework将此模型作为API呈现给Angular Web应用程序.在我的Angular Web应用程序中,我想要一个组合框小部件,随着所有这些选择而下降.不是整数,而是文本选择,如"blurb","标准问题"等.
现在,我可以将组合框手动编写到Angular应用程序中,但是根据DRY的精神,是否可以编写一个只返回这些选项的DRF序列化程序(即QUESTION_TYPES对象),这样我就可以用一个组合框来填充ReST查询?
而"可能",我想我的意思是"简单而优雅".也许我的意思是"ReSTful".(以这种方式这样做是否很重要?)
就是想 ...
谢谢
约翰
我可能会尝试以下操作:
# models.py
class Question(models.Model):
QUESTION_NAMES = (
'Blurb',
'Group Header',
'Group Footer',
'Sub-Group Header',
'Sub-Group Footer',
'Save Button',
'Standard Question',
'Text-Area Question',
'Multiple-Choice Question',
'Standard Sub-Question',
'Multiple-Choice Sub-Question')
QUESTION_VALS = (10, 20, 21, 30,
31, 50, 100, 105, 110,
120, 130)
QUESTION_TYPES = tuple(zip(QUESTION_VALS, QUESTION_NAMES))
# Personal choice here: I never name attribs after Python built-ins:
qtype = models.IntegerField(default=100,choices=QUESTION_TYPES)
Run Code Online (Sandbox Code Playgroud)
以下不工作,因为我认为它应该
(以下是我对序列化对象列表的原始直觉,但它不起作用。无论如何我将它留在这里,因为它似乎应该起作用。)
好的,所以我们有办法自己访问字符串,现在我们只需要序列化它们,为此,我可能会尝试使用ListField in DRF3,它应该支持sourcekwarg,我想?
# serializers.py
from .models import Question
class YourSerializer(ModelSerializer):
names = serializers.ListField(
child=serializers.CharField(max_length=40),
source=Question.QUESTION_NAMES
)
class Meta:
model = Question
fields = ('names', etc.)
Run Code Online (Sandbox Code Playgroud)
以下确实返回结果列表
回退:使用一个SerializerMethodField:
from .models import Question
class YourSerializer(serializers.ModelSerializer):
...
names = serializers.SerializerMethodField()
def get_names(self, obj):
return Question.QUESTION_NAMES
class Meta:
model = Question
Run Code Online (Sandbox Code Playgroud)
演示:
In [1]: q = Question.objects.create()
Out[1]: <Question: Question object>
In [2]: ser = YourSerializer(q)
In [3]: ser.data
Out[3]: {'id': 1, 'names': ['Blurb', 'Group Header', 'Group Footer', 'Sub-Group Header', 'Sub-Group Footer', 'Save Button', 'Standard Question', 'Text-Area Question', 'Multiple-Choice Question', 'Standard Sub-Question', 'Multiple-Choice Sub-Question'], 'qtype': 100}
Run Code Online (Sandbox Code Playgroud)
如果您将 aModelViewSet与 a 结合使用ModelSerializer,OPTIONS请求将返回可用于获取选择选项的元数据。
from models import Question
from rest_framework import serializers
class QuestionSerializer(serializers.ModelSerializer):
class Meta:
model = Question
from rest_framework.viewsets import ModelViewSet
class QuestionChoicesViewSet(ModelViewSet):
queryset = Question.objects.all()
serializer_class = QuestionSerializer
Run Code Online (Sandbox Code Playgroud)
这会给你一个包含actions属性的响应,它可能看起来像这样:
"actions": {
"POST": {
"id": {
"type": "integer",
"required": false,
"read_only": true,
"label": "ID"
},
"qtype": {
"type": "choice",
"required": false,
"read_only": false,
"label": "Qtype",
"choices": [
{
"display_name": "Blurb",
"value": 10
},
{
"display_name": "Group Header",
"value": 20
},
{
"display_name": "Group Footer",
"value": 21
},
{
"display_name": "Sub-Group Header",
"value": 30
},
//...
}
}
}
Run Code Online (Sandbox Code Playgroud)
您可以遍历该choices属性qtype以获取所有可用选项。
要更熟悉此主题,您可以阅读:元数据
| 归档时间: |
|
| 查看次数: |
4366 次 |
| 最近记录: |