使Django Rest框架中需要BooleanField

使Django Rest框架中需要BooleanField,django,django-rest-framework,Django,Django Rest Framework,我有一个带有布尔字段的模型,我想用Django rest框架对其进行反序列化,我想让序列化程序在post请求中缺少字段时进行投诉。然而,事实并非如此。它默默地将丢失的布尔值解释为False class UserProfile(models.Model): """ Message between two users """ user = models.OneToOneField(User, verbose_name="django authentication user

我有一个带有布尔字段的模型,我想用Django rest框架对其进行反序列化,我想让序列化程序在post请求中缺少字段时进行投诉。然而,事实并非如此。它默默地将丢失的布尔值解释为False

class UserProfile(models.Model):
    """
     Message between two users
"""
     user = models.OneToOneField(User, verbose_name="django authentication user", related_name='user_profile')
     newsletter = models.BooleanField(null=False)
     research = models.BooleanField(null=False)
模型是使用如下序列化器创建的:

 class UserProfileSerializer(serializers.ModelSerializer):
 research = BooleanField(source='research', required=True)
 newsletter = BooleanField(source='newsletter', required=True)

 class Meta:
    model = UserProfile
    fields = ('research', 'newsletter')
在我看来,我也在创建一个用户,因此我有一些手动步骤:

 def post(self, request, format=None):
    userprofile_serializer = UserProfileSerializer(data=request.DATA)
    reg_serializer = RegistrationSerializer(data=request.DATA)
    phone_serializer = PhoneSerializer(data=request.DATA)


    errors = {}
    if userprofile_serializer.is_valid() and reg_serializer.is_valid() and phone_serializer.is_valid():
        user = reg_serializer.save()
        data = reg_serializer.data

        user_profile = userprofile_serializer.object
        user_profile.user = user
        userprofile_serializer.save()

        return Response(data, status=status.HTTP_201_CREATED)

    errors.update(reg_serializer.errors)
    # ...
    return Response(errors, status=status.HTTP_400_BAD_REQUEST)
但是,下面的测试用例失败了,因为rest框架没有抱怨缺少参数,而是从_native插入了一个False in

     def test_error_missing_flag(self):
    data = {'username': "test", 'password': "123test", 'email': 'test@me.com',
            'newsletter': 'true', 'uuid': self.uuid}

    response = self.client.post(reverse('app_register'), data)
    # should complain that 'research' is not found
    self.assertTrue('research' in response.data)

如果我将“research”字段替换为整数字段,序列化程序将按预期失败。有什么想法吗?

布尔字段和
必需的
参数有问题。现在应该在master中修复

请参阅本期:

添加

your_field = serializers.NullBooleanField(required=False)
序列化程序中


就这样。它将起作用:)

创建一个新的自定义类:

从rest\u框架导入序列化程序
类RequirableBooleanField(serializers.BooleanField):
默认\u empty\u html=serializers.empty
现在,您可以使用:

research=requireablebooleanfield(required=True)

research=requireableBooleanField(required=False)

对于那些从2013年开始阅读@Tom的公认答案并发现这仍然不起作用的人来说,这是因为这种行为是针对HTML表单输入的。这是我的建议


要使用JSON负载的
序列化程序.BooleanField
,请通过执行
request.POST.dict()
请求.POST
转换为Python
dict
,并在初始化时将其传递给序列化程序。

谢谢。正在调试它,也找到了默认值。主人有多稳定?我可以把它用于生产吗?如果你不同意一个具体的承诺,那么生活应该是美好的。不要只跟踪master tho——下一个版本计划为2.4.0,这意味着API的一些部分将在弃用过程中移动。这是非常严格的,但你不会想在没有意识到的情况下升级到它。干杯。现在我坚持使用2.3.7,但过度编写了BooleanField,如下所示:
类非默认BooleanField(BooleanField):default=None
Hi,我使用的是DRF 3.1.1,除非我使用serializers.NullBooleanField(),否则这似乎仍然是个问题。例如,使用serializers.BooleanField和“required=True”,如果字段未提交到serialiser,则不会引发任何错误。我认为您还可以添加serializers.BooleanField(required=False,allow_null=True)