2017-01-26 4 views
0

실제로 양식이 없으므로 현재 API를 만들려면 ViewSet을 사용하고 있습니다.양식 게시에 외래 키를 제출하는 방법은 무엇입니까? python/django

나는 두 가지 모델을 가지고, 하나는 어떻게 든 유지,

이 나는 ​​시리얼은 다음 POST 입력의 유효성을 검사하는 데 사용할 만든 사용자에 외래 키와 creator라는 필드를 사용하여 일반 사용자 모델과 그룹 모델 내가 이해할 수와 내가 게시하려고 할 때 creator_id가 null 그것 때문에 너무 테스트,하지만 난 비록 creator_id를 입력 한 어떤

null value in column "creator_id" violates not-null constraint

말하는 오류가 발생합니다. 잘못된 방식으로 입력 했습니까? 또는 저장하기 위해 외래 키를 얻으려면 어떻게해야합니까?

내 그룹 모델은 다시

class Group(Model): 
    creator = ForeignKey(User, 
         null=True, // I used this to test I am right with the error 
         blank=True, // I used this to test I am right with the error 
         on_delete=CASCADE, 
         related_name="%(class)ss", 
         related_query_name="%(class)s") 
    group_name = CharField(max_length=256, unique=True) 
    created_at = DateTimeField(auto_now_add=True) 

    def __unicode__(self): 
     return self.group_name 

처럼, 난 내가 그것 때문에 creator_id은 null 일 수 없습니다 그건 바로 것을 생각하면보고 싶어 그래 내가 추가 한 후, 바로이기 때문에 null=True, blank=True이 추가 이 두 필드는 더 이상 오류가 발생하지 않습니다.

내 GroupSerializer

class GroupSerializer(ModelSerializer): 
    group_id = SerializerMethodField() 
    creator_name = SerializerMethodField() 
    creator_id = SerializerMethodField() 

    class Meta: 
     model = Group 
     fields = ['group_id', 'group_name', 'creator_id', 'creator_name'] 

    def get_group_id(self, obj): 
     return obj.id 

    def get_creator_name(self, obj): 
     return obj.creator.tutor_name 

    def get_creator_id(self, obj): 
     return obj.creator.id 

    def create(self, validated_data): 
     return Group.objects.create(**validated_data) 

{ 
     "group_name": "bridge", 
     "creator_id": 1 
    } 

"creator_id": "1""creator": "1"

을 시도

@csrf_exempt 
    def create(self, request): 
     data = GroupSerializer(data=request.data) // this would return the `group_name` and `creator_id` I entered 
     if data.is_valid(): // this would return true 
      data.save() 
      return Response({'status': True}) 
     return Response({'status': False, 'message': data.errors}, status=400) 

내가 사용 게시 시도 ... 내 view.py 0

여전히 같은 오류가 발생합니다 ...

어떻게 해결할 수 있습니까?

미리 감사드립니다.

답변

0

저는 시리얼 라이저를 잘못 선언했다고 생각합니다. ModelSerializer를 사용하고 있지만 필드 목록에서 선언하는 필드가 모델의 필드와 일치하지 않습니다. fields은 배열이 아니라 목록입니다. 나는 이것이 그와 비슷한 것이어야한다고 생각합니다.

class Group(Model): 
    creator = ForeignKey(User, 
         on_delete=CASCADE, 
         related_name="%(class)ss", 
         related_query_name="%(class)s") 
    group_name = CharField(max_length=256, unique=True) 
    created_at = DateTimeField(auto_now_add=True) 

    def __unicode__(self): 
     return self.group_name 

class GroupSerializer(ModelSerializer): 
    class Meta: 
     model = Group 
     fields = ('creator', 'group_name', 'created_at') 

또한 당신이 그것을 테스트하고 있던 알고 있지만 생각 나쁜 관행은 같은 분야에 모두 null=Trueblank=True 선언. 그것은 하나가되어야합니다.

여기에 문서를 참조하십시오 : http://www.django-rest-framework.org/api-guide/serializers/#modelserializer

+0

당신이 무슨 뜻인지 이해할 수 있지만, 제가 creator_id''에'creator'을 변경하려면? 이것은 내가 붙어있는 곳이다. 모델에서 'group_name'을 사용하고 있지만'SerializerMethodField'를 통해 원하는 경우'g_name'으로 변경할 수 있다고 가정 해 보겠습니다. – Dora

+0

모델에서'creator'가 ForeignKey입니다. 그래서 장고에서는 실제로 다른 모델 (이 경우'User')에 대한 참조 인 id 번호를 참조하지 않습니다. 그 모델은 그것의 자신의'id' 필드를 가지고 있습니다. 'creator_id'를 원한다면 실제로'creator.id'가 될 것입니다.'User' 모델'id' 필드를 참조 할 것이기 때문입니다. – joed4no

+0

그래서 나는'def get_creator_id (self, obj) : return obj.creator를 가지고있다.id '를 serializer의'fields'에 입력하면 어떻게됩니까? 아니면 생성자의 ID를 어떻게 얻을 수 있습니까? – Dora