2017-03-26 3 views
0

で失敗し、私は連絡先のリストを示すだけでなく、このシリアライザを使用して新しい連絡先作成のためのListCreateAPIView持っている:新しいレコードをINGのPOSTするためジャンゴDRF - ListCreateAPIView POST深さ= 2

class ContactPostSerializer(serializers.ModelSerializer): 
    class Meta: 
    model = Contact 
    exclude = ('id',) 

を、I idを除外して、DRFがヌルについて文句を言わないようにする必要があります。idしかし、このシリアライザでレコードをリストする場合、シリアライザはForeignKeyフィールドのオブジェクトを返しません。これらのオブジェクトを取得するには、depth = 2を追加します。だから今シリアライザは、次のようになります。

class ContactPostSerializer(serializers.ModelSerializer): 
    class Meta: 
    model = Contact 
    exclude = ('id',) 
    depth = 2 

しかし、今、depth = 2で、私はもうPOST Sを行うことはできません。それはヌルのid値について再び不平を言う。

編集:私はdepth=2を持って来るエラーは、私が作成している新しいレコードではなく、外部キーオブジェクトのモデルに固有であると付け加えるべきです。

私はここで何が欠けていますか?

+0

ですあなたの 'id'フィールドは自動増分主キーですか?もしそうなら、シリアライザで 'id'を除外する必要はありません。 'id'フィールドを持たないデータを投稿すると、DRFはそれに不平を言うことはなく、あなたのために新しいIDが生成されます。 – Enix

+0

@Enixあなたは正しいですが、それでも問題は解決しません。ソリューションを説明するために回答を投稿します – Garfonzo

答えて

0

シリアライザにdepth=2の部分が書き込み可能でないときに問題が発生することがわかりました。それが失敗した理由です。もう1つは、URLを変更したくないため、リスト作成と作成の両方に/contacts/しかないことです。そうするために、私はクラスを調整してレスポンスを処理する必要がありました。ここで

は私が思い付いたものです:

api.pyこれに

class ContactCreateSerializer(serializers.ModelSerializer): 
    class Meta: 
    model = Contact 
    exclude =() 

class ContactSerializer(serializers.ModelSerializer): 
    class Meta: 
    model = Contact 
    exclude =() 
    depth = 2 

クレジット

class ContactViewSet(viewsets.ModelViewSet): 
    queryset = Contact.objects.all() 
    serializer_class = ContactSerializer 

    def create(self, request, *args, **kwargs): 
    # If we're creating (POST) then we switch serializers to the one that doesn't include depth = 2 
    serializer = ContactCreateSerializer(data = request.data) 
    if serializer.is_valid(): 
     self.object = serializer.save() 
     headers = self.get_success_headers(serializer.data) 
     # Here we serialize the object with the proper depth = 2 
     new_c = ContactSerializer(self.object) 
     return Response(new_c.data, status = status.HTTP_201_CREATED, headers = headers) 
    return Response(serializer.errors, status = status.HTTP_400_BAD_REQUEST) 

シリアライザは、SO、私はそれを把握する助けた答え:https://stackoverflow.com/a/26741062/717682

関連する問題