Python 使用Django REST框架的位字段序列化

Python 使用Django REST框架的位字段序列化,python,django,django-rest-framework,django-bitfield,Python,Django,Django Rest Framework,Django Bitfield,我有一个模型,其中包含一个。尝试使用Django Rest Framework序列化对象时,返回以下错误: {"flags": ["Enter a whole number."]} (标志是一个位字段) 如何使用Django Rest框架序列化位字段?找到了答案。我需要为位字段创建一个自定义序列化程序: class BitFieldSerializer(serializers.WritableField): def to_native(self, obj):

我有一个模型,其中包含一个。尝试使用Django Rest Framework序列化对象时,返回以下错误:

{"flags": ["Enter a whole number."]}
标志
是一个
位字段


如何使用Django Rest框架序列化
位字段?

找到了答案。我需要为
位字段
创建一个自定义序列化程序:

class BitFieldSerializer(serializers.WritableField):        
    def to_native(self, obj):
        return int(obj)
并在模型序列化程序中使用它:

class MyModelSerializer(serializers.ModelSerializer):
    flags = BitFieldSerializer()

看起来rest框架3.1中Tzach的答案的形式现在是

class BitFieldSerializer(serializers.Field):

     def to_internal_value(self, obj):
         return int(obj)
e、 g.每小时


“请注意,2.x版中存在的WritableField类已不存在。。如果字段支持数据输入,则应将字段子类化并重写为_internal_value()。

如果要读取和写入列表中的标志,请使用另一个选项。”

class BitFieldSerializer(serializers.Field):
    def to_internal_value(self, data):
        model_field = getattr(self.root.Meta.model, self.source)
        result = BitHandler(0, model_field.keys())
        for k in data:
            try:
                setattr(result, str(k), True)
            except AttributeError:
                raise serializers.ValidationError("Unknown choice: %r" % (k,))
        return result

    def to_representation(self, value):
        return [i[0] for i in value.items() if i[1] is True]
返回示例:
['flag1','flag4']


这假定您使用的是ModelSerializer。我获取模型字段键(它的标志)的方法似乎有点粗略,如果有人知道更好的方法,请发表评论。

非常感谢!这使得它更加可行,因为对于django位字段,我们无法获得正确的位值作为标志。这使得客户很难对字段进行更改