LoginSignup
0
1

More than 3 years have passed since last update.

Django Rest Framework 2.x のチュートリアル(5)

Last updated at Posted at 2019-08-14

Requirement

  • Python > 3.6
  • Mac or Linux (recommend)
  • SQLite3

AuthUser に紐付いたタスクを作る

前回幼児の食べ散らかしのようなゴミAPIを大量生産してしまったので、ここらへんでしっくりしたものを作ってみましょう。

設計方針は Tutorials 3 で作ったタスクと ユーザのそれに近いものを作る、というものです。

手順をぱっと考えると

  • AuthUser に紐付いた TaskTodoItemAsAuthUser 関連クラスを作る
  • ログインによる制限機能を実装する
    • ログインしているユーザのタスク生成API

の二本立てになります。

しかしまずは Swagger 上でのデバッグ方法について考えなければならないでしょう。ということで先んじてこちらか触れていきます。

Swagger 上でのログイン確認

Django Login の文字が見えますね。これがログインをするための設定です。

これをクリックすると、ログイン画面なんてねえよ!って怒られます。とりあえずログインするためには localhost:8000/admin からログインをして、そこから再び localhost:8000/swagger の画面に戻る必要があります。

AuthUser のログインが必要なAPIを作る

Model を作る

脳死で models/todoItemAsAuth.py を作ります。

from django.db import models
from .authUser import AuthUser


# Create your models here.
class TodoItemAsAuth(models.Model):
    owner = models.ForeignKey(AuthUser,
                              to_field='username',
                              on_delete=models.CASCADE)
    todo_name = models.CharField(max_length=100)
    todo_text = models.TextField(blank=True, null=True)
    dead_line = models.DateTimeField()
    raise_date = models.DateTimeField(auto_now_add=True)
    importance = models.IntegerField(null=True)
    close_date = models.DateTimeField(blank=True, null=True)

    def __str__(self):
        return "{}-{}".format(self.owner, self.todo_name)

    class Meta:
        ordering = ('dead_line', 'raise_date')

admin で確認できるようにするために admin.py も書き足します。

# ...
from .models.todoItemAsAuth import TodoItemAsAuth

# ...
admin.site.register(TodoItemAsAuth)
admin.site.register(AuthUser, UserAdmin)

Serializer を作る

こちらも何も考えずに書いています。唯一違うのは、ReadOnlyField という謎の user があることですが、今は気にしないでください。

# ...
from draft_todo.models.todoItemAsAuth import TodoItemAsAuth


# ...
class TaskAuthAsAuthUserCreateSerializer(ModelSerializer):
    user = serializers.ReadOnlyField(source='authuser.username')

    class Meta:
        model = TodoItemAsAuth
        fields = ['owner', 'todo_name', 'todo_text', 'dead_line']

View を作る

class TaskAuthUserCreateTodoItemAPIView(LoginRequiredMixin, CreateAPIView):
    queryset = TodoItemAsAuth.objects.all()
    serializer_class = TaskAuthAsAuthUserCreateSerializer

    def perform_create(self, serializer):
        serializer.save(owner=self.request.user)

LoginRequiredMixin については 公式 を参考にしてください。

今回は、self.request.user にユーザの情報が用感じに含まれていること、それを用いて serializer が機能していうることがわかってもらえれば十分です。

(とはいえこれ、頑張れば偽装できそうな作りをしているので若干不安材料が残りますね。実際のところ、どうなんでしょう)

URL を作る

urls.py を編集して下さい。

urlpatterns = [
       # ...
       path('draft_authuser/create_task',
         dview.TaskAuthUserCreateTodoItemAPIView.as_view(),
        name='dact'),
]

Swagger で確認する

Swagger で確認すると、たしかにログイン時にタスクが追加あできることがわかります。()ログインしていないと、別の画面へ飛ばされます。これは LoginRequiredMixin の機能です。

Admin で確認すると、確かに追加されていることがわかります。

今回はこんな感じで短めに終わりにしましょう。お疲れ様でした。

Tips

LoginRequiredMixin を関数っぽく書くとどうなるの?

公式 にあるように、@method_decorator(login_required) となります。

backlog

この状態のデータは、このレポジトリの release v0.1.5 にあります。

レポジトリ

目次

Django Rest Framework 2.x のチュートリアル(0)
Django Rest Framework 2.x のチュートリアル(1)
Django Rest Framework 2.x のチュートリアル(2)
Django Rest Framework 2.x のチュートリアル(3)
Django Rest Framework 2.x のチュートリアル(4)
Django Rest Framework 2.x のチュートリアル(5)
Django Rest Framework 2.x のチュートリアル(6)

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1