在Django Rest Framework中创建BooleanField

时间:2013-08-27 12:49:13

标签: django django-rest-framework

我有一个带有布尔字段的模型,我想用Django休息框架反序列化,我希望序列化程序在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)

使用如下的Serialiser创建模型:

 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)

但是,以下测试用例失败,因为其余框架没有抱怨丢失的参数,而是在from_native中插入一个False

     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)

如果我取代我的研究'具有Integer字段的字段,序列化程序按预期失败。有什么想法吗?

4 个答案:

答案 0 :(得分:2)

布尔字段和required参数存在问题。现在应该在master中修复。

请参阅此问题:https://github.com/tomchristie/django-rest-framework/issues/1004

答案 1 :(得分:1)

创建一个新的自定义类:

from rest_framework import serializers

class RequirableBooleanField(serializers.BooleanField):
    default_empty_html = serializers.empty

现在,您可以使用:

research = RequirableBooleanField(required=True)

research = RequirableBooleanField(required=False)

答案 2 :(得分:0)

添加

your_field = serializers.NullBooleanField(required=False)

serializer中。

就是这样。会的:)

答案 3 :(得分:0)

对于阅读@Tom 2013 年接受的答案并发现这仍然不起作用的任何人,这是因为此行为适用于 HTML 表单输入。这是original issue

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