drf
DRF+ReactのSPAでWebsocketのチャットサイトをつくる
DRFでModelViewSetの動的ルーティング(URL内引数)を作る
例えば、ModelViewSetが以下のような場合 from rest_framework import viewsets from .models import Category,Topic,Reply from .serializers import CategorySerializer,TopicSerializer,ReplySerializer class CategoryView(viewsets.ModelViewSet): serializer_class = CategorySerializer queryset = Category.objects.all() class TopicView(viewsets.ModelViewSet): serializer_class = TopicSerializer queryset = Topic.objects.all() class ReplyView(viewsets.ModelViewSet): serializer_class = ReplySerializer queryset = Reply.objects.all() ルーティングは、このように DefaultRouter を使うと良い。 from django.contrib import admin from django.urls import path,include from rest_framework import routers from bbs import views router = routers.DefaultRouter() router.register(r"topics", views.TopicView, "topic") router.register(r"categories", views.CategoryView, "category") router.register(r"replies", views.ReplyView, "reply") urlpatterns = [ path('admin/', admin.site.urls), path('api/', include(router.urls)), ] だが、これではTopicに紐付いていないReplyまで取得できてしまう。 そこで、 HTTP GET /api/replies/ でReplyを取得するのではなく、 HTTP GET /api/topics/1/replies/ このように動的ルーティング(URL引数 ...DRF+ReactのSPAでCRUD簡易掲示板をつくる
DRFはいつCSRF検証をするのか?
開発中、おかしなことが起こった。 これまでCSRFトークン無しで、PUTやDELETEメソッドが送信できていた。 だが、突然、同様の状況で403エラー(CSRF token missing)が起きた。 CSRFトークン無しでリクエストできていたものが、急に403エラーになりCSRF検証を行うようになった。 何故か? DRFのビューでは、CSRF検証が免除されている https://github.com/encode/django-rest-framework/blob/master/rest_framework/viewsets.py#L146 DRFのビューは、このように .as_view()の戻り ...DRFで400 Bad Request エラーが出る時、Serializerを確認する
DateTimeFieldで、フォーマットを指定したserializers.pyを作る
- 作成日時:
- 最終更新日時:
- Categories: サーバーサイド
- Tags: django drf serializers.py react
DateTimeFieldを含むモデルで、シリアライザをこう作ると from rest_framework import serializers from .models import Category,Todo class CategorySerializer(serializers.ModelSerializer): class Meta: model = Category fields = ("id", "created_at", "name", "color") class TodoSerializer(serializers.ModelSerializer): category = CategorySerializer() class Meta: model = Todo fields = ("id", "category", "created_at", "content", "deadline", "is_done") このようにタイムゾーン表記になってしまう。 作成日: 2024-12-25T12:00:00+09:00 締切: 2024-12-25T12:00:00+09:00 年月日表記に修正をするには、serializers.pyでフォーマットを指定する。 from rest_framework import serializers from .models import Category,Todo class CategorySerializer(serializers.ModelSerializer): created_at = serializers.DateTimeField(format="%Y年%m月 ...1対多のモデル構造で、ネストしたserializers.pyを作る
- 作成日時:
- 最終更新日時:
- Categories: サーバーサイド
- Tags: django drf serializers.py react
通常、 class Category(models.Model): name = models.CharField(max_length=100) class Todo(models.Model): title = models.CharField(max_length=200) category = models.ForeignKey(Category, on_delete=models.CASCADE) このモデル構造の場合、シリアライザはこうなる。 from rest_framework import serializers from .models import Todo, Category class CategorySerializer(serializers.ModelSerializer): class Meta: model = Category fields = ['id', 'name'] class TodoSerializer(serializers.ModelSerializer): class Meta: model = Todo fields = ['id', 'title', 'category'] ただこれだと、フロントサイドで得られる、JSONは、 [ { "id": 1, "title": "Todo 1", "category": 1 }, { "id": 2, "title": "Todo 2", "category": 2 } ] このように、categoryのidのみであり、カテゴリ名を表示することはできない。 ネストしたSerializerを指定する。 そこで、このように、TodoSerial ...Reactでaxiosを使ってリクエストをすると、2回送られる問題【React.StrictMode問題】
【Django Rest Framework】モデルメソッドはシリアライザメソッドで代用する
DRFとReactのSPAを作る時、DTLは使えない。 これまでのようにモデルオブジェクトからメソッドを呼び出すことはできない。 そこで、シリアライザにメソッドを用意して代用する。 モデル 前提として、このようにモデルメソッドを作った時。 from django.db import models class Topic(models.Model): comment = models.CharField(verbose_name="コメント",max_length=2000) def comment_lenth(self): return len(self.comment) これでは、React ...