Djangoroidの奮闘記

python,django,angularJS1~三十路過ぎたプログラマーの奮闘記

Django REST Frameworkに再挑戦 その3

概要

Django REST Frameworkに再挑戦 その3

参考サイト

www.django-rest-framework.org

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は削除されていることがわかる。