我有一个带有布尔字段的模型,我想用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框架没有抱怨缺少参数,而是在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)
如果我将"research"字段替换为Integer字段,则序列化程序将按预期失败。有什么想法吗?
布尔字段和required
参数存在问题。现在应该在master中修复。
请参阅本期:https://github.com/tomchristie/django-rest-framework/issues/1004
添加
your_field = serializers.NullBooleanField(required=False)
在CCD_ 2中。
就是这样。它会工作的:)
对于任何阅读过@Tom从2013年接受的答案并发现这仍然不起作用的人来说,这是因为这种行为是针对HTML表单输入的。这是最初的一期。
要将serializers.BooleanField
与JSON负载一起使用,请通过执行request.POST.dict()
将request.POST
转换为Python dict
,并在初始化时将其传递给序列化程序。
创建一个新的自定义类:
from rest_framework import serializers
class RequirableBooleanField(serializers.BooleanField):
default_empty_html = serializers.empty
现在,您可以使用:
research = RequirableBooleanField(required=True)
或
research = RequirableBooleanField(required=False)