当前位置:   article > 正文

【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__"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

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"]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/44690
推荐阅读
相关标签
  

闽ICP备14008679号