有如下模型,作者表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]}
此時接口返回信息為:

滿足要求,實現
