gpt4 book ai didi

django - 枚举 Django Rest Framework 序列化器中的模型选择

转载 作者:行者123 更新时间:2023-12-02 02:15:12 26 4
gpt4 key购买 nike

我有一个使用 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)

我正在使用 Django Rest Framework 将此模型作为 API 呈现给 Angular Web 应用程序。在我的 Angular Web 应用程序中,我想要一个包含所有这些选项的组合框小部件。不是整数,而是文本选择,例如“blurb”、“标准问题”等。

现在,我可以将组合框手动编码到 Angular 应用程序中,但本着 DRY 的精神,是否可以编写一个仅返回这些选择(即 QUESTION_TYPES 对象)的 DRF 序列化器,以便我可以填充组合带有 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)
<小时/>

以下内容并不像我想象的那样工作

(以下是我对序列化对象列表的最初直觉,但它不起作用。无论如何我将它留在这里,因为它看起来应该起作用。)

好的,我们有办法自己访问字符串,现在我们只需要序列化它们,为此,我可能会尝试使用 ListField in DRF3 ,我想它应该支持 source kwarg?

# 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.)
<小时/>

以下内容确实返回结果列表

后备:使用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

演示:

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}

关于django - 枚举 Django Rest Framework 序列化器中的模型选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29246559/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com