Django Serializer Field可选

时间:2017-08-11 16:42:49

标签: python django serialization checkbox

现在我有一个输入和两个复选框,它们将一个变量返回到python后端。 我想让两个复选框的默认值为false,如果选中它们则返回true。 我认为我的问题是因为我使用的是串行器,如果取消选中,我不会从这两个复选框中获取值。 如果选中该复选框,我的代码将起作用,并且值将保存在模型中。如果不是我收到错误

HTML

<input type="text" ng-model="var.name">
<input ng-model="var.pem" type="checkbox">
<input ng-model="var.key" type="checkbox">

串行

class CreateSerializer(serializers.ModelSerializer):
    class Meta:
        model = Thing
        fields = (  
                    'name',
                    'pem',
                    'key',
                 )

模型

class Thing(models.Model):
        name = models.CharField(max_length=50)
        pem = models.BooleanField(default=False)
        key = models.BooleanField(default=False)

如果复选框保持未选中状态,是否可以为Serializer设置现有值?

1 个答案:

答案 0 :(得分:0)

当您未在复选框中传递任何内容时,validated_data字典中没有值,该字典基本上将pemkey键分配为None字典。
您在模型中描述的字段不支持null值,因为它是BooleanField

<强>解决方案

name = thing_ser.validated_data.get('name')
# add default values if the key is not present.
pem = thing_ser.validated_data.get('pem', False)
keystore = thing_ser.validated_data.get('keystore', False)

# if it was present and it was None.
if pem is None:
    pem = False
if keystore is None:
    keystore = False

# save into model
thing1=Thing(name=name, pem=pem, keystore=keystore)
thing1.save()

此解决方案更改了两项内容,当False中没有validated_datapem个密钥时,它会将默认值添加为keystore。此外,主要部分是检查它们是否为None,如果是,请将其设为False