serializerの使用とDRFの解析器とシーケンス化コンポーネント
オリジナルserializerの使用
from django.core.serializers import serialize
class StudentView(APIView):
def get(self, request):
origin_students = Student.objects.all()
serialized_students = serialize("json", origin_students)
return HttpResponse(serialized_students)
DRF解析ユニット
次の操作を行います.
#1.
from rest_framework.views import APIView
#2. APIView
class LoginView(APIView):
parser_classes = [FormParser]
def get(self, request):
return render(request, 'parserver/login.html')
# .3. request.data json
def post(self, request):
# request drf , django request
# request.data property,
# request.data self.parser_classes
#
print(request.data) # {'username': 'alex', 'password': 123}
return JsonResponse({"status_code": 200, "code": "OK"})
インタプリタコンポーネントソースフロー
コンポーネントのシーケンス化
いくつかのモデルを定義
from django.db import models
# Create your models here.
class Publish(models.Model):
nid = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
city = models.CharField(max_length=32)
email = models.EmailField()
def __str__(self):
return self.name
class Author(models.Model):
nid = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
age = models.IntegerField()
def __str__(self):
return self.name
class Book(models.Model):
title = models.CharField(max_length=32)
publishDate = models.DateField()
price = models.DecimalField(max_digits=5, decimal_places=2)
publish = models.ForeignKey(to="Publish", to_field="nid", on_delete=models.CASCADE)
authors = models.ManyToManyField(to="Author")
def __str__(self):
return self.title
url、リクエストインタフェースの設計
GETインタフェース
url:
from django.urls import re_path
from serializers import views
urlpatterns = [
re_path(r'books/$', views.BookView.as_view())
]
新しいapp_という名前のserializers.pyのモジュールは、すべてのシーケンス化の使用をこのモジュールに集中し、プログラムをデカップリングします.
from rest_framework import serializers
from .models import Book
#1.
class BookSeriazlizer(seriazlizers.Serializer):
#2. ( model , ),
model
title = serializers.CharField(max_length=128)
publish_date = serializers.DateTimeField()
price = serializers.DecimalField(max_digits=5, decimal_places=2)
publish = serializers.CharField(max_length=32)
authors = serializers.CharField(max_length=32)
ビュークラス、シーケンス化コンポーネントの使用
from rest_framework.views import APIView
from rest_framework.response import Response
from .models import Book
from .app_serializer import BookSerializer
class BookView(APIView):
def get(self,request):
#3. GET , QuerySet
origin_books = Book.objects.all()
#4. ,many False, , True
serialized_books = BookSerializer(origin_books,many=True)
return Response(serialized_books.data)
次に、POSTMANでインタフェースを要求した後に返されるテストデータを示します.ManyToManyFieldフィールドが意図されていない場合を除き、問題はありません.
[
{
"title": "Python ",
"publishDate": null,
"price": "119.00",
"publish": " ",
"authors": "serializers.Author.None"
},
{
"title": "Python ",
"publishDate": null,
"price": "128.00",
"publish": " ",
"authors": "serializers.Author.None"
}
]
フィールドが複数のパラメータとして定義場合、例えばauthors.all、取り出した結果はquersetで、フロントエンドに本が来て、このようなデータはあまり友好的ではありませんて、少し改善します
class BookSerializer(serializers.Serializer):
title = serializers.CharField(max_length=32)
price = serializers.DecimalField(max_digits=5, decimal_places=2)
publishDate = serializers.DateField()
publish = serializers.CharField()
publish_name = serializers.CharField(max_length=32, read_only=True, source='publish.name')
publish_email = serializers.CharField(max_length=32, read_only=True, source='publish.email')
# authors = serializers.CharField(max_length=32, source='authors.all')
authors_list = serializers.SerializerMethodField()
def get_authors_list(self, authors_obj):
authors = list()
for author in authors_obj.authors.all():
authors.append(author.name)
return authors
# :get_ ,
POSTインタフェースの設計
def post(self, request):
verified_data = BookSerializer(data=request.data)
if verified_data.is_valid():
book = verified_data.save()
#
authors = Author.objects.filter(nid__in=request.data['authors'])
book.authors.add(*authors)
return Response(verified_data.data)
else:
return Response(verified_data.errors)
マルチペアマルチフィールドも手動で取得する必要があります
def get_authors_list(self, book_obj):
author_list = list()
for author in book_obj.authors.all():
author_list.append(author.name)
return author_list
def create(self, validated_data):
# {'title': 'Python666', 'price': Decimal('66.00'), 'publish': '2'}
validated_data['publish_id'] = validated_data.pop('publish')
book = Book.objects.create(**validated_data)
return book
def update(self, instance, validated_data):
#
instance.title = validated_data.get('title', instance.title)
instance.publishDate = validated_data.get('publishDate', instance.publishDate)
instance.price = validated_data.get('price', instance.price)
instance.publish_id = validated_data.get('publish', instance.publish.nid)
instance.save()
return instance
やはり面倒な感じがしますが、フィールドが多ければ、シーケンス化を書くのも負担です.もっと簡単な方法は以下の通りです.
# ModelSerializer
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = ('title',
'price',
'publish',
'authors',
'author_list',
'publish_name',
'publish_city'
)
extra_kwargs = {
'publish': {'write_only': True},
'authors': {'write_only': True}
}
publish_name = serializers.CharField(max_length=32, read_only=True, source='publish.name')
publish_city = serializers.CharField(max_length=32, read_only=True, source='publish.city')
author_list = serializers.SerializerMethodField()
def get_author_list(self, book_obj):
# queryset [{}, {}, {}, {}]
authors = list()
for author in book_obj.authors.all():
authors.append(author.name)
return authors
詳細手順:
転載先:https://www.cnblogs.com/--kai/p/10105690.html