Django 多模型序列化组件 - django-rest-multiple-models


1. 介绍内容

如果你有一个需求, 你开发的 Django 项目 API 中需要同时返回两个模型类的序列化数据, 这个时候你可能会想, 可以一个个实现查询, 在用 Response 对象返回就好了。 那我偏不!

Django 组件 django-rest-multiple-models 帮你满足你的需求, 可以实现多个模型的序列化, 只需要你的配置信息即可。

本期小编推送2021初学者一定会用到的Python资料,含有小编自己呕心沥血整理的免费书籍/视频/在线文档和编辑器/源代码,关于Python的安装qun:850973621

2. PIP 安装

使用 Python-pip 安装:

python3 -m pip install django-rest-multiple-models
复制代码

3. 配置和基本使用

在 Django 项目 settings.py 中注册组件 APP:

INSTALLED_APPS = [
    ...
    'drf_multiple_model',
]
复制代码

这时候你就可以导入模块并实现你的功能了, 如:

# Models
class Play(models.Model):
    genre = models.CharField(max_length=100)
    title = models.CharField(max_length=200)
    pages = models.IntegerField()

class Poem(models.Model):
    title = models.CharField(max_length=200)
    style = models.CharField(max_length=100)
    lines = models.IntegerField()
    stanzas = models.IntegerField()
复制代码
# Serializers
class PlaySerializer(serializers.ModelSerializer):
    class Meta:
        model = Play
        fields = ('genre', 'title', 'pages')

class PoemSerializer(serializers.ModelSerializer):
    class Meta:
        model = Poem
        fields = ('title', 'stanzas')
复制代码

在上面的案例中我们定义了 Models 和 Serializer, 现在可以直接撰写 API 视图类:

from drf_multiple_model.views import ObjectMultipleModelAPIView

class TextAPIView(ObjectMultipleModelAPIView):
    querylist = [
        {'queryset': Play.objects.all(), 'serializer_class': PlaySerializer},
        {'queryset': Poem.objects.filter(style='Sonnet'), 'serializer_class': PoemSerializer},
    ]
复制代码

你就可以获取到类似于下面的响应数据:

{
    'Play' : [
        {'genre': 'Comedy', 'title': "A Midsummer Night's Dream", 'pages': 350},
        {'genre': 'Tragedy', 'title': "Romeo and Juliet", 'pages': 300},
        ...
    ],
    'Poem' : [
        {'title': 'Shall I compare thee to a summer's day?', 'stanzas': 1},
        {'title': 'As a decrepit father takes delight', 'stanzas': 1},
        ...
    ]
}
复制代码

你也可以使用 FlatMultipleModelAPIView 来继承:

from drf_multiple_model.views import FlatMultipleModelAPIView

class TextAPIView(FlatMultipleModelAPIView):
    querylist = [
        {'queryset': Play.objects.all(), 'serializer_class': PlaySerializer},
        {'queryset': Poem.objects.filter(style='Sonnet'), 'serializer_class': PoemSerializer},
        ...
    ]
复制代码

你将会得到:

[
    {'genre': 'Comedy', 'title': "A Midsummer Night's Dream", 'pages': 350, 'type': 'Play'},
    {'genre': 'Tragedy', 'title': "Romeo and Juliet", 'pages': 300, 'type': 'Play'},
    ....
    {'title': 'Shall I compare thee to a summer's day?', 'stanzas': 1, 'type': 'Poem'},
    {'title': 'As a decrepit father takes delight', 'stanzas': 1, 'type': 'Poem'},
    ...
]
复制代码

当然可以进行过滤和分页, 以及其他的属性, 如使用标签等等

Success is the ability to go from one failure to another with no loss of enthusiasm. — Winston Churchill

成功是一个人从一次失败走向另一次失败而没有丧失热情的能力。—温斯顿邱吉尔

原文链接:https://juejin.cn/post/6844904198908149767

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值