【Django Rest Framework】ルーティングを複数登録したい
解決したいこと
現在DRFを用いて、新規登録、ログイン機能、ログアウト機能を作っています。
困っていることとしてはルーティングが適切にしけてないことで
以下のようなURLをViewsetsで作りたいのですがうまくいきません
.DefaultRouter()では複数のURLを登録することはできないのでしょうか?
作りたいURL
http://localhost:8000/api/resister
http://localhost:8000/api/login
URL
url.py
from django.contrib import admin
from django.urls import path,include
from rest_framework import routers
from sayhellotobikeAPI.views import UserInfoViewSet,UserLoginView
# DefaultRouter クラスのインスタンスを代入
defaultRouter = routers.DefaultRouter()
# userInfo/ にUserInfoViewSetをルーティングする
defaultRouter.register('resister',UserInfoViewSet)
urlpatterns = [
path('admin/',admin.site.urls),
# defaultRouter をinclude する
path('api/',include(defaultRouter.urls)),
path('login/', UserLoginView.as_view(), name='login'),
]
url.py
from django.contrib import admin
from django.urls import path,include
from rest_framework import routers
from sayhellotobikeAPI.views import UserInfoViewSet,UserLoginView
# DefaultRouter クラスのインスタンスを代入
defaultRouter = routers.DefaultRouter()
# userInfo/ にUserInfoViewSetをルーティングする
defaultRouter.register('resister',UserInfoViewSet)
urlpatterns = [
path('admin/',admin.site.urls),
# defaultRouter をinclude する
path('api/',include(defaultRouter.urls)),
path('login/', UserLoginView.as_view(), name='login'),
]
例)
import logging
# ロガーの設定
logger = logging.getLogger(__name__)
from rest_framework import serializers
from django.contrib.auth.models import User
from .models import UserInfo
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ['id', 'username', 'email', 'password']
extra_kwargs = {'password': {'write_only': True}}
class UserInfoSerializer(serializers.ModelSerializer):
user = UserSerializer() # Userモデルのシリアライザーをネスト
class Meta:
model = UserInfo
# json で出力するフィールド
fields = ('id','user', 'birth_day','favorite','created_at')
def update(self, instance, validated_data):
# userフィールドのデータを取得
user_data = validated_data.pop('user', None)
if user_data:
# userフィールドの更新処理を実装
instance.user.username = user_data.get('username', instance.user.username)
instance.user.email = user_data.get('email', instance.user.email)
instance.user.save()
# インスタンスを保存して更新したデータを返す
instance.save()
return instance
def delete(self, instance):
instance.delete()
class UserLoginSerializer(serializers.Serializer):
username = serializers.CharField()
password = serializers.CharField(write_only=True)
view
from rest_framework import viewsets
from .models import UserInfo
from .serializer import UserInfoSerializer, UserSerializer
from rest_framework.authtoken.views import ObtainAuthToken
from rest_framework.authtoken.models import Token
from rest_framework.response import Response
class UserInfoViewSet(viewsets.ModelViewSet):
queryset = UserInfo.objects.all()
serializer_class = UserInfoSerializer
def perform_create(self, serializer):
# ユーザ情報を保存する前に、新しいUserレコードを作成して保存
user_data = self.request.data.get('user') # もしくは request.data.get('user')
user_serializer = UserSerializer(data=user_data)
if user_serializer.is_valid():
user = user_serializer.save()
serializer.save(user=user) # UserInfoにUserを関連付けて保存
else:
# もしくはバリデーションエラーを処理
pass
class UserLoginView(ObtainAuthToken):
def post(self, request, *args, **kwargs):
serializer = self.serializer_class(data=request.data, context={'request': request})
serializer.is_valid(raise_exception=True)
user = serializer.validated_data['user']
token, created = Token.objects.get_or_create(user=user)
return Response({'token': token.key})
例)
model
from django.db import models
from django.contrib.auth.models import User
class UserInfo(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
birth_day = models.DateField(verbose_name='生年月日')
favorite = models.CharField(verbose_name='お気に入りの', max_length=100, default='特になし') # favorite フィールドを追加
created_at = models.DateTimeField(verbose_name='作成日時', auto_now_add=True)
def __str__(self):
return self.user.username
すみません💦ご教示いただけるとうれしいです
0