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

詳細手順:
  • ModelSerializerを継承する:Serializer
  • を継承しない
  • extraを追加kwargsクラス変数:extra_kwargs = {‘publish’: {‘write_only’: True}}

  • 転載先:https://www.cnblogs.com/--kai/p/10105690.html