2017-08-28 23 views
1

Django Rest Frameworkを使用して特定のテーブルの行を一括作成しようとしています。私はdocumentationに、DRFがそれをサポートしていることが分かります。Django Rest FrameworkのListSerializerを使用して一括作成

views.py

class UserProfileFeedViewSet(viewsets.ModelViewSet): 
    """Handles creating, reading and updating profile feed items.""" 

    authentication_classes = (TokenAuthentication,) 
    queryset = models.ProfileFeedItem.objects.all() 
    serializer_class = serializers.ProfileFeedItemSerializer(queryset, many=True) 
    permission_classes = (permissions.PostOwnStatus, IsAuthenticated) 

    def perform_create(self, serializer): 
     """Sets the user profile to the logged in user.""" 

     serializer.save(user_profile=self.request.user) 

serializers.py

class ProfileFeedItemListSerializer(serializers.ListSerializer): 
    def create(self,validated_data): 
     feed_list = [ProfileFeedItem(**item) for item in validated_data] 
     return ProfileFeedItem.objects.bulk_create(feed_list) 

class ProfileFeedItemSerializer(serializers.ModelSerializer): 
    """A serializer for profile feed items.""" 

    class Meta: 
     model = models.ProfileFeedItem 
     list_serializer_class = ProfileFeedItemListSerializer 
     fields = ('id', 'user_profile', 'status_text', 'created_on') 
     extra_kwargs = {'user_profile': {'read_only': True}} 

私は常に、このエラーを取得し、管理フォームを使用して投稿してみてください。ここで間違っていることを特定するのを助けてくれますか?

TypeError at /api/feed/ 'ProfileFeedItemListSerializer' object is not callable Request Method: GET Request URL: http://127.0.0.1:8080/api/feed/ Django Version: 1.11 Exception Type: TypeError Exception Value: 'ProfileFeedItemListSerializer' object is not callable Exception Location: /home/ubuntu/.virtualenvs/profiles_api/local/lib/python3.5/site-packages/rest_framework/generics.py in get_serializer, line 111 Python Executable: /home/ubuntu/.virtualenvs/profiles_api/bin/python Python Version: 3.5.2

答えて

0

それを試してみてください:これにこの

serializer_class = serializers.ProfileFeedItemSerializer(queryset, many=True) 

を変更しようと、残念ながら

def create(self, request, *args, **kwargs): 
    many = isinstance(request.data, list) 
    serializer = self.get_serializer(data=request.data, many=many) 
    serializer.is_valid(raise_exception=True) 
    self.perform_create(serializer) 
    headers = self.get_success_headers(serializer.data) 
    return Response(serializer.data, headers=headers) 

def perform_create(self, serializer): 
    if type(serializer.validated_data) == list: 
     for item in serializer.validated_data: 
       item.update({'user_profile': self.request.user}) 
    else: 
     serializer.validated_data.update({'user_profile': self.request.user}) 
    serializer.save() 

を今、私は解決策を確認することはできませんが、多分それは正しい方法を与える

+0

この辞書を使用して単一の辞書データセットを投稿することができますが、辞書の投稿リストはそのままです ** AttributeError: 'list'オブジェクトには属性 'get'がありません** – Prasanna

+0

答えに誤字が見つかりました。 –

+0

私は、コードフローがperform_createに達していないデータセットのリストを渡します。データは常に辞書として渡されることを期待しています。 受信データが辞書のリストであり、1つの辞書ではないことをDRFに伝える方法が必要です。 – Prasanna

1

Serializer_classはクラスインスタンスではなく、クラスでなければなりません。

serializers.ProfileFeedItemSerializer 
+0

私はそれを変更しました。私は、フォームを送信したとき、私は、コンソールにエラー以下を参照してください。今 [ { "STATUS_TEXT"::: "こんにちは" }、{ "世界" "STATUS_TEXT"}] IAMが、次のデータセットを投稿しよう: AttributeError: 'list'オブジェクトに属性 'get'がありません – Prasanna

+0

@Prasanna質問に完全なエラーテキストを追加できますか? – neverwalkaloner

+0

貼り付けた完全なトレースはこちらhttp://dpaste.com/2PEF17P – Prasanna

関連する問題