【DRF使用自定义序列化器,通过外键实现多表关联查询】


提示:以下是本篇文章正文内容,下面案例可供参考

一、序列化器使用外键关联查询

示例:在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"]

猜你喜欢

转载自blog.csdn.net/weixin_45876175/article/details/129738053