Python 未调用Django Rest Framework get_字段

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

我有一个现有的Django代码库,它使用Django Rest框架公开数据。我在序列化程序中有一个字段被定义为
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)