[DRF utilise un sérialiseur personnalisé pour implémenter des requêtes d'association multi-tables via des clés étrangères]


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

1. Le sérialiseur utilise une requête d'association de clé étrangère

Exemple : Utilisez le cas du livre dans le framework Django pour écrire un ensemble d'interfaces d'API REST qui prennent en charge l'ajout, la suppression, la modification et la requête de données de livre, afin de comprendre le développement de l'API REST. Réalisez une requête d'association multi-tables via le sérialiseur.

2. Le fichier py du framework django DRF

1.serializer.py

Le code est le suivant (exemple) :

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__"

Fichier 2.models.py

Le code est le suivant (exemple) :

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"]

Je suppose que tu aimes

Origine blog.csdn.net/weixin_45876175/article/details/129738053
conseillé
Classement