2017-01-26 16 views
0

実際に私はフォームを持っていない、私は現在ViewSetを使用してAPIを作成しています。フォームキーに外部キーを送信する方法Python/django

私は2つのモデル、1が通常のユーザモデルと、その後POST入力を検証するためにそれを使用する私はシリアライザを作成したユーザー

へのForeignKeyでcreatorという名前のフィールドを使用してグループモデルで、何とか私は続けるを持っています私が理解することができますどの

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

を言って、私は私が投稿しようとすると、creator_idがnullですが、私もcreator_idを入力しなかったので、それはだとあまりにもテストエラーを取得に。間違った方法で入力していますか、それを保存するために外部キーを取得する方法はありますか?

は、私のグループのモデルは、再びこの

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がある追加しましたこれらの2つのフィールドは、私はもうエラーを取得しません。

私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) 

私view.py

@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) 

私が使用して投稿してみました...

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

は​​と"creator": "1"

を試してみました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です。だから、Djangoでは実際にはID番号、別のモデルへの参照(この場合は 'User')を参照していません。そのモデルは独自の 'id'フィールドを持っています。 'creator_id'を望むなら、それは' User'モデル 'id'フィールドを参照するので、実際には' creator.id'でしょう。 – joed4no

+0

だから私は 'def get_creator_id(self、obj):return obj.creatorを持っている。id 'をシリアライザの 'fields'に入力するか、または作成者のIDを取得するにはどうしたらいいですか? – Dora

関連する問題