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)