2013-08-27 3 views
4

장고 휴식 프레임 워크를 사용하여 비 직렬화하려는 부울 필드가있는 모델이 있습니다. 게시물 요청에 필드가없는 경우 serializer에서 불만을 제기하고 싶습니다. 그러나 그렇지 않습니다. 누락 된 부울을 거짓으로 해석합니다.장고 Rest 프레임 워크에서 부울 필드 필요함

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) 

을 나머지 프레임 워크는 누락 된 매개 변수에 대해 불평하지 않고 from_native에 False를 삽입하기 때문에 다음 테스트 사례는 실패합니다.

 def test_error_missing_flag(self): 
    data = {'username': "test", 'password': "123test", 'email': '[email protected]', 
      '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'필드를 serializer가 예상대로 실패하는 Integer 필드로 바꾸면. 어떤 아이디어?

답변

2

부울 필드 및 required 인수에 문제가있었습니다. 이제 마스터에서 수정해야합니다. https://github.com/tomchristie/django-rest-framework/issues/1004

+0

감사 :

이 문제를 참조하십시오. 그냥 디버깅하고 기본값도 발견했습니다. 주인은 얼마나 안정합니까? 프로덕션을 위해 이것을 가져올 수 있습니까? –

+0

특정 커밋에 대해 고정하면 인생은 잘되어야합니다. master tho를 추적하지 마십시오. 다음 버전은 2.4.0으로 계획됩니다. 이는 API의 일부가 비추천 프로세스를 통해 이동한다는 것을 의미합니다. 그것은 매우 엄격하지만 실현하지 않고 업그레이드 만하고 싶지는 않습니다. –

+1

건배. 지금은 2.3.7을 고수하지만 다음과 같이 BooleanField를 덮어 씁니다.'class NonDefaultBooleanField (BooleanField) : default = None' –

관련 문제