Django REST Frameworkに再挑戦 その3
概要
Django REST Frameworkに再挑戦 その3
参考サイト
www.codingforentrepreneurs.com
Update & Destroy(Delete) API View
- Update, DestroyViewをviews.pyに追記する。
class PostDetailAPIView(RetrieveAPIView): queryset = Post.objects.all() serializer_class = PostDetailSerializer lookup_field = 'slug' class PostUpdateAPIView(UpdateAPIView): queryset = Post.objects.all() serializer_class = PostDetailSerializer lookup_field = 'slug' class PostDeleteAPIView(DestroyAPIView): queryset = Post.objects.all() serializer_class = PostDetailSerializer lookup_field = 'slug' class PostListAPIView(ListAPIView): queryset = Post.objects.all() serializer_class = PostListSerializer
- urls.pyに追記する。
urlpatterns = [ url(r'^$', PostListAPIView.as_view(), name='list'), # url(r'^create/$', post_create), url(r'^(?P<slug>[\w-]+)/$', PostDetailAPIView.as_view(), name='detail'), url(r'^(?P<slug>[\w-]+)/edit/$', PostUpdateAPIView.as_view(), name='update'), url(r'^(?P<slug>[\w-]+)/delete/$', PostDeleteAPIView.as_view(), name='delete'), ]
この状態で、edit, delete にそれぞれアクセスすると、django rest frameworkのページが表示される。スゲーーー!!
ただし、
"detail": "Method \"GET\" not allowed."
と表示されてしまい、dataの中身は表示されない。中身は表示されないが、上書きは可能な状態。deleteも可能。
Update & Delete in the Python Shell
- django rest framework のUpdateをshellで試してみる。
>>> from posts.models import Post >>> from posts.api.serializers import PostDetailSerializer >>> obj = Post.objects.get(id=3) >>> obj <Post: tasty> >>> data = { ... "title": "Yeahh buddy", ... "content": "New content", ... "publish": "2017-1-4", ... "slug": "yeah-buddy", ... } # 第1引数にobj(インスタンス)を与えて、第2引数に上書きしたいdataを渡す。 >>> new_item = PostDetailSerializer(obj, data=data) >>> if new_item.is_valid(): ... new_item.save() ... else: ... print(new_item.errors) ... <Post: Yeahh buddy> >>> new_item.data {'content': 'New content', 'slug': 'yeah-buddy', 'title': 'Yeahh buddy', 'id': 3, 'publish': '2017-01-04'}
- Deleteを試してみる。
>>> new_item.delete() Traceback (most recent call last): File "<console>", line 1, in <module> AttributeError: 'PostDetailSerializer' object has no attribute 'delete' # PostDetailSerializerに、delete()メソッドは定義されてないため、実行できない。 # new_itemではなく元々のmodelの方の、obj(インスタンス)を削除してみる。 >>> obj.delete() >>> obj <Post: Yeahh buddy> >>> obj = Post.objects.get(id=3) posts.models.DoesNotExist: Post matching query does not exist. # objは削除されていることがわかる。