LoginSignup

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

【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

1Answer

以下のようなURLをViewsetsで作りたいのですがうまくいきません

「うまくいかない」とはどういう結果になったのかを具体的に書かないと、これを読んでる人には情報がなさすぎです。

.DefaultRouter()では複数のURLを登録することはできないのでしょうか?

公式ドキュメントのサンプルコードを見ると可能っぽいですね。

2

Your answer might help someone💌