提示:以下是本篇文章正文内容,下面案例可供参考
一、序列化器使用外键关联查询
示例:在Django框架中使用图书案例来写一套支持图书数据增删改查的REST API接口,来理解REST API的开发。通过序列化器实现多表关联查询。
二、django DRF框架的py文件
1.serializer.py
代码如下(示例):
class BookDetailsSerializer(serializers.ModelSerializer):
"""
由书架查询书籍明细的序列化器
"""
borrowed_Record = serializers.SerializerMethodField()
book = serializers.SerializerMethodField()
//一查多字段
def get_borrowed_Record(self, obj):
book_details = BorrowingRecord.objects.prefetch_related(
'book_detail'
).filter(book_detail_id=obj.id, status=0, if_deleted=False)
res = BorrowingRecordSerializer(instance=book_details, many=True)
return res.data
//多查一字段
def get_book(self, obj):
book = Books.objects.filter(id=obj.book.id)
res = BookssSerializer(instance=book, many=True)
return res.data
class Meta:
model = BookDetail
fields = "__all__"
2.models.py文件
代码如下(示例):
class BookDetail(models.Model):
"""
图书明细
"""
book_status = (
(0, '在库中'),
(1, '已借出'),
)
if_break = (
(0, '未损坏'),
(1, '已损坏'),
(2, '已丢失')
)
id = models.CharField(max_length=15, verbose_name='书籍明细id', help_text="book_detail_id", primary_key=True, auto_created=True, editable=False)
book = models.ForeignKey(Books, on_delete=models.CASCADE, verbose_name="书籍信息")
code = models.CharField(verbose_name='书本编号', max_length=100, null=True, blank=True)
location = models.ForeignKey(Bookshelf, on_delete=models.CASCADE, verbose_name="图书位置")
status = models.IntegerField(choices=book_status, default=0, verbose_name="书籍是否在库")
if_break = models.IntegerField(choices=if_break, default=0, verbose_name='书籍实际新旧情况')
add_time = models.DateTimeField(verbose_name='添加时间', auto_now_add=True)
if_deleted = models.BooleanField(default=False, verbose_name="是否删除")
QR_code = models.ImageField(upload_to='QRcode', null=True, blank=True, verbose_name="二维码地址")
class Meta:
verbose_name = "书籍明细信息"
verbose_name_plural = verbose_name
db_table = "book_detail"
ordering = ["-add_time"]
class Books(models.Model):
"""
书籍信息
"""
id = models.CharField(max_length=15, verbose_name='书籍id', help_text="bookuuid", primary_key=True, auto_created=True, editable=False)
name = models.CharField(max_length=100, verbose_name="书籍名称", null=True, blank=True)
author = models.CharField(max_length=50, verbose_name="作者", null=True, blank=True)
translator = models.CharField(max_length=50, verbose_name="译者", null=True, blank=True)
publication_time = models.DateTimeField(verbose_name='出版时间', null=True, blank=True)
press = models.CharField(verbose_name='出版社', max_length=100, null=True, blank=True)
classification = models.ForeignKey(BookClassification, on_delete=models.CASCADE, verbose_name="图书分类") # 联级删除需要注意,on_delete=models.CASCADE表示主表对应记录删除之后,副表对应记录也会删除
add_time = models.DateTimeField(verbose_name='添加时间', auto_now_add=True)
code = models.CharField(verbose_name='书籍编号', max_length=100, null=True, blank=True)
total_quantity = models.IntegerField(verbose_name='书籍数量', default=0)
if_deleted = models.BooleanField(default=False, verbose_name="是否删除")
class Meta:
verbose_name = "书籍信息"
verbose_name_plural = verbose_name
db_table = "book_info"
ordering = ["-add_time"]
class BorrowingRecord(models.Model):
"""
借阅记录
"""
book_status = (
(0, '未归还'),
(1, '已归还'),
)
if_break = (
(0, '未损坏'),
(1, '已损坏'),
(2, '已丢失')
)
book_detail = models.ForeignKey(BookDetail, on_delete=models.CASCADE, verbose_name="具体书籍", null=True, blank=True)
borrower = models.CharField(max_length=20, verbose_name='借阅人', null=True, blank=True)
lending_time = models.DateTimeField(verbose_name='借出时间', auto_now_add=True)
pre_return_time = models.DateTimeField(verbose_name='预计归还时间', null=True, blank=True)
status = models.IntegerField(choices=book_status, default=0, verbose_name="是否归还")
return_time = models.DateTimeField(verbose_name='实际归还时间', null=True, blank=True)
returnee = models.CharField(max_length=20, verbose_name='归还人', null=True, blank=True)
if_break = models.IntegerField(choices=if_break, verbose_name='归还时是否损坏', default=0)
if_deleted = models.BooleanField(default=False, verbose_name="是否删除")
class Meta:
verbose_name = "借阅记录"
verbose_name_plural = verbose_name
db_table = "borrowing_record"
ordering = ["status", "-lending_time"]