Python 未调用Django Rest Framework get_字段
我有一个现有的Django代码库,它使用Django Rest框架公开数据。我在序列化程序中有一个字段被定义为Python 未调用Django Rest Framework get_字段,python,django,serialization,django-rest-framework,Python,Django,Serialization,Django Rest Framework,我有一个现有的Django代码库,它使用Django Rest框架公开数据。我在序列化程序中有一个字段被定义为SerializerMethodField(): categories = serializers.SerializerMethodField() 在同一序列化程序中,定义了此get_方法: def get_categories(self, obj): return [obj.categories.choices[key.upper()] for key in obj.cate
SerializerMethodField()
:
categories = serializers.SerializerMethodField()
在同一序列化程序中,定义了此get_方法:
def get_categories(self, obj):
return [obj.categories.choices[key.upper()] for key in obj.categories]
这是可行的,但我必须添加一种方法,允许用户将新数据发布到api中。在模型中,该字段定义为多选字段:
categories = MultiSelectField( choices=CATEGORY_CHOICES, max_length=64, max_choices=6, null=True, blank=True)
由于SerializerMethodField
根据定义是只读的,因此我将该字段更改为CharField
(因为它在数据库中是varchar):
这对发布新内容有效,但不幸的是,get\u categories()
不再被调用
有人知道我如何让它调用
get_categories()
方法,同时保持CharField
?我不确定这是否是影响您的根本问题,但我想您可能会使用ChoiceField
来代替
例如,创建类:
from rest_framework import serializers
class ChoicesField(serializers.Field):
def __init__(self, choices, **kwargs):
self._choices = choices
super(ChoicesField, self).__init__(**kwargs)
def to_representation(self, obj):
return self._choices[obj]
def to_internal_value(self, data):
return getattr(self._choices, data)
然后像这样使用它:
class MyModel(models.Model):
CATEGORY_CHOICES = Choices(
('A', 'CategoryA', 'CategoryA'),
('B', 'CategoryB', 'CategoryB')
)
category = models.CharField(max_length=1, choices=CATEGORY_CHOICES)
谢谢你的建议。实际上,该字段在模型中定义为
MultiSelectField()
(我将该信息添加到问题中)。在这种情况下,您有什么建议吗?另外,构造的Choices()
是什么?对不起,Choices()
来自django model utils
()!您是否尝试过使用我建议的方法,但使用了w/multiplechicefield
()而不是ChoiceField
?
class MyModel(models.Model):
CATEGORY_CHOICES = Choices(
('A', 'CategoryA', 'CategoryA'),
('B', 'CategoryB', 'CategoryB')
)
category = models.CharField(max_length=1, choices=CATEGORY_CHOICES)