1. 程式人生 > >DjangoDRF序列化組件使用

DjangoDRF序列化組件使用

fields append ima response 正向查詢 cts turn framework read

創建一個Django項目,名字:untitled1
創建三張表

from django.db import models


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", related_name='books', on_delete=models.CASCADE)
    authors = models.ManyToManyField(to="Author")

    def __str__(self):
        return self.title
#####################################################################################
# 一對多反向查詢
# urls.py
from django.urls import path
from bms import views

urlpatterns = [
    # 一對多反向查詢
    path('index', views.PublishView.as_view()),
]

# views.py
class PublishView(APIView):
    def get(self, request):
        publishes = Publish.objects.all()
        serializer_data = PublishSerializer1(publishes, many=True)
        return Response(serializer_data.data)

# publish_serializer.py
class PublishSerializer1(serializers.ModelSerializer):
    book_list = serializers.SerializerMethodField()

    def get_book_list(self, obj):
        # obj是序列化模型的對象
        # 這是Book類,所以這裏obj就是圖書對象
        print('----->', obj)
        
        books = []
        for book in obj.books.all():
            books.append(book.title)

        return books

    class Meta:
        model = Publish
        fields = ('nid', 'name', 'city', 'email', 'book_list')
#####################################################################################       
# 一對多正向查詢/多對多正向查詢
# urls.py
from django.urls import path
from bms import views

urlpatterns = [
    # 一對多反向查詢
    path('index2', views.PublishView.as_view()),
]

# views.py
class BookView(APIView):
    def get(self, request):
        books = Book.objects.all()
        serializer_data = BookSerializer1(books, many=True)
        return Response(serializer_data.data)

# book_serializer.py
from rest_framework import serializers
from bms.models import Book, Publish


class PublishSerializer(serializers.ModelSerializer):
    class Meta:
        model = Publish
        fields = ('nid', 'name', 'city', 'email')


class BookSerializer1(serializers.ModelSerializer):
    # 一對多正向查詢
    publish = PublishSerializer()
    # 多對多正向查詢
    author_list = serializers.SerializerMethodField()

    # 請註意,get_必須與字段名稱一致,否則會報錯。
    def get_author_list(self, obj):
        # obj是序列化模型類的對象
        # 這裏是Book類,所以obj就是圖書對象
        print('----->', obj)
        authors = []
        for author in obj.authors.all():
            authors.append(author.name)

        return authors

    class Meta:
        model = Book
        fields = ('title', 'publishDate', 'price', 'publish', 'author_list')
#####################################################################################   
# urls.py
from django.urls import path
from bms import views

urlpatterns = [
    # 一對多反向查詢
    path('index0', views.PublishView.as_view()),
]

# views.py
class BookView2(APIView):
    def get(self, request):
        books = Book.objects.all()
        serializer_data = BookSerializer2(books, many=True)
        return Response(serializer_data.data)
        
# book_serializer.py
class BookSerializer2(serializers.Serializer):
    title = serializers.CharField(max_length=128)
    publishDate = serializers.DateField()
    price = serializers.DecimalField(max_digits=5, decimal_places=2)
    # 處理一對多字段
    publish = serializers.CharField()
    publish_title = serializers.CharField(max_length=32, read_only=True, source='publish.name')
    publish_email = serializers.CharField(max_length=32, read_only=True, source='publish.email')
    # 處理多對多字段
    author_list = serializers.SerializerMethodField()

    def get_author_list(self, obj):
        # obj是序列化模型的對象
        # 這是Book類,所以這裏obj就是圖書對象
        print('----->', obj)
        authors = []
        for author in obj.authors.all():
            authors.append(author.name)

        return authors
#####################################################################################   
# urls.py
from django.urls import path
from bms import views

urlpatterns = [
    # 一對多反向查詢
    path('authors', views.AuthorView1.as_view()),
]

# views.py
class AuthorView1(APIView):
    def get(self, request):
        authors = Author.objects.all()
        serializer_data = AuthorSerializer(authors, many=True)
        return Response(serializer_data.data)
        
# author_serializer.py
from rest_framework import serializers
from bms.models import Author


class AuthorSerializer(serializers.ModelSerializer):
    class Meta:
        model = Author
        fields = '__all__'

DjangoDRF序列化組件使用