Django Rest framework中序列化A表(主表)時怎么獲取B表(從表)的數據


有如下模型,作者表Author為主表,圖書表Book為從表

from django.db import models


# Create your models here.


class Author(models.Model):
    """
    圖書作者表
    """
    name = models.CharField('作者姓名', max_length=20)
    age = models.SmallIntegerField('年齡')

    def __str__(self):
        return self.name


class Book(models.Model):
    """
    圖書表
    """
    book_name = models.CharField('圖書名稱', max_length=100)
    author = models.ForeignKey(Author, related_name='author_book')
    publish_time = models.DateTimeField('出版時間', auto_now_add=True)

    def __str__(self):
        return self.book_name

其中圖書表的author字段為外鍵,表示多個圖書對應一個作者(現實中其實也可以是一個圖書對應多個作者,這就是多對多關系,此處簡化為多對一關系)

視圖類如下:

from rest_framework import generics, serializers
from ..models import Author


class AuthorSerializer(serializers.ModelSerializer):

    class Meta:
        model = Author
        fields = '__all__'



class AuthorList(generics.ListAPIView):
    """
    查詢所有作者信息,及其對應編寫的書籍
    """
    queryset = Author.objects.all()
    serializer_class = AuthorSerializer

上面只對Author模型進行序列化,則輸出接口信息為:

 

 假設,現在有需求為:返回作者對應的所有書籍信息。

分析:

  以上序列化實現了只讀取Author一個模型的信息,所以接口返回只是自身的表字段,那么需要返回對應書籍信息則需要跨表從book模型取數據。

改造Author的序列化器為如下:

class AuthorSerializer(serializers.ModelSerializer):
    # 該字段信息通過下方的get_books方法獲取數據
    books = serializers.SerializerMethodField()

    class Meta:
        model = Author
        fields = '__all__'

    # 方法名稱必須與上面定義的序列化字段一致,格式為:"get_自定義字段名",參數:author_obj為主表author對象,用小寫
    def get_books(self, author_obj):
        # 通過book模型中的author字段的related_name反查出作者對應的圖書集合
        # 如果外鍵沒有指定related_name參數,則使用 author_obj.book_set.all()獲取從表的數據。注意這里的book要用小寫
        book_query_set = author_obj.author_book.all()
        # 遍歷圖書集合獲取圖書的名稱和出版時間,並返回
        return {'count': book_query_set.count(),
                "data": [{'name': book_obj.book_name, 'publish_time': book_obj.publish_time} for
                         book_obj in book_query_set]}

 

此時接口返回信息為:

 

滿足要求,實現 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM