2013-05-16 5 views
13

Django REST Framework 2.0을 사용하고 있습니다.ForeignKey에서 null 값을 허용하지 않습니다.

class Mission(models.Model): 
    assigned_to = models.ForeignKey('auth.User', 
            related_name='missions_assigned', 
            blank = True) 

여기 내보기 클래스입니다 :

여기 내 모델 클래스입니다

class MissionList(generics.ListCreateAPIView): 
    model = Mission 
    serialize_class = MissionSerializer 
  1. 멀티 파트 양식 assigned_to 필드에 빈 선택할 수있는 브라우저에서 렌더링됩니다.

Cannot assign None: "Mission.assigned_to" does not allow null values.

답변

46

blank 옵션은 양식 유효성 검사에 사용되며, 데이터베이스에 기록 할 때 null가 사용됩니다 원시 JSON을 게시 할 때

  • , 나는 다음과 같은 오류 메시지가 나타납니다.

    따라서 해당 필드에 null=True을 추가 할 수 있습니다.

    편집 : (null에 의해 제어)

    1. 검사기 (blank에 의해 제어)
    2. 데이터베이스 제한
    : 객체를 저장할 때 두 단계를 고려 주석

    을 계속

    default 옵션의 경우예를 들어,
    default=5, blank=True, null=False의 값을 할당하지 않은 경우 (blank=True), 기본값 (5)을 갖고 있으므로 (2)를 전달하고 None 대신 DB로 5을 씁니다.
    blank=True, null=False으로, None을 DB에 쓰려고하기 때문에 (1)을 통과하지만 (2)는 통과하지 못합니다.

    따라서 필드를 선택적으로 만들려면 default=SOMETHING, blank=True, null=False 또는 blank=True, null=True을 사용하십시오.

    또 다른 예외는 CharField과 같은 문자열 형 필드입니다.
    blank=True만을 사용하는 것이 좋습니다., 뒤에 null=False이 남습니다.
    이렇게하면 필드가 문자열 (> = 1 chars) 또는 빈 문자열 ('', len() == 0)이되며 결코 None이되지 않습니다.

    이유는 null=True이 설정되어있을 때 "unset"상태에 대한 가능한 값은 빈 문자열과 None이며 이는 혼란스럽고 버그를 유발할 수 있습니다.

  • +0

    빈 = 진정한 '의미합니다 '항상'null = True'와 함께 사용해야합니까? 내 양식에서 비어있는 것을 선택할 수없는 이유는 무엇입니까? 나는'blank = True'를 사용했습니다. –

    +1

    'assigned_to == None'이 양식 유효성 검사기를 통과했지만 데이터베이스는 통과하지 못했습니다. 'null = True'가 없으면 데이터베이스에'None'을 쓸 수 없습니다. 따라서 일반적으로 선택적 필드가 필요하면'blank'와'null'을 모두'True'로 설정하십시오. – user1034937

    +2

    그러나 'default'옵션과 문자열 형 필드라는 두 가지 예외가 있습니다. (여기에 덧붙여 코멘트 대신 여기에 덧붙이고 싶습니다.) – user1034937

    0

    ForeignKey는이 동작이 설정된 경우 null 값을 허용합니다. 코드는 다음과 같이 표시됩니다

    class Mission(models.Model): 
        assigned_to = models.ForeignKey('auth.User', related_name='missions_assigned',blank = True,null=True) 
    

    을 당신은 널 (null)를 작성해야 = 진정한 참고 : 모델을 변경 한 후, 당신은 python manage.py makemigrations yourappname을 실행하는 데 필요한 다음 python manage.py migrate