web项目 day03(三)

本文介绍如何在Django中设计Profile接口,包括路由配置、中间件应用及模型转字典功能实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

profile接口

首先将路由接口的路由写好
在这里插入图片描述
( 当光标位于get_profile时,使用alt + enter键可以直接在apis.py文件中创建接口(视图函数) )
在这里插入图片描述
而这两个接口都有一个共同的步骤,获取从前端传来的用户id uid,然后通过uid去数据库进行相关操作

在这里插入图片描述
所以,这两行代码,可以抽象出来,
request.user,在Django中,可以在request的身上绑定user,所以,这两行代码可以放到common文件夹的中间件中整合一下
接着中间件中的代码,如果有uid,说明时登陆状态,就可以通过uid去获取数据,然后把用户对象赋值给request.user
在这里插入图片描述
然后上面两行代码就可以转变成一行代码
在这里插入图片描述

get-profile接口与 to_dict Mixin

对于get-profile接口,现在可以通过user直接获取profile,但profile是一个对象,所以应当将profile转化为字典
和前面的转化为字典有些不同,这里有一个比较特殊的知识点 多继承
在 profile 模型中加入 ModelToDictMixin
在这里插入图片描述
这样的Profile类是一个比较特殊的类,它继承了Model和ModelToDictMixin两个类

扩展 : 在任何的编程语言中,都是不建议使用多继承的,如果子类调用了两个父类中相同名称的函数,那么就会引起冲突(python中有算法,会决定调用的是哪个类中的函数),但是对于程序员来说,可能并不清楚调用的是哪个父类中的函数,这样就使得继承不明确
在开发中有一句话,叫用组合而不用继承

ModelToDictMixin 不一样,每个Mixin中都没有重复的函数(或者说没有重复功能的代码),这样就不会遇到同名函数的情况,虽然这个本质上还是一个多继承,但是这个多继承不冲突,这个叫单继承,多Mixin
Mixin的作用是扩展子类的功能
ModelToDictMixin,就是把模型转化成字典,这种类型的函数还有ModelToListMixin,把模型转化成列表

Mixin 是比较底层的功能,将其独立出来,放在libs文件夹中
在libs文件夹中创建一个orm .py文件,创建ModelToDictMixin这个类

在此之前,先了解一下这个知识点 _meta.fields,获取模型中的字段
在这里插入图片描述
通过字段去获取信息,这些信息以key-value形式存在
在这里插入图片描述

ModelToDictMixin

根据 _meta.fields这个方法,去orm .py文件中完成ModelToDictMixin这个类

class ModelToDictMixin():
    def to_dict(self):
        attr_dict = {}
        fields = self._meta.fields

        for field in fields:
            field_name = field.attname
            attr_dict[field_name] = getattr(self, field_name)

        return attr_dict

然后在models .py文件中导入这个类,供Profile类继承

from libs.orm import ModelToDictMixin

修改接口,
在这里插入图片描述
进行测试,达到预期的效果,江模型转化为字典
在这里插入图片描述
前面说到,这个auto_play字段比较特殊,如果不需要转化传过去,可以可以修改一下代码
在接口返回数据转化的时候,使用exclude这个方法,将auto_play排除在外
接口修改一下
在这里插入图片描述

如果不需要排除auto_play,那就不需要上面红线中的代码,调用to_dict方法时,exclude=None

class ModelToDictMixin():
    def to_dict(self, exclude=None):
        if exclude is None:
            exclude = []

        attr_dict = {}
        fields = self._meta.fields

        for field in fields:
            field_name = field.attname
            if field_name not in exclude:
                attr_dict[field_name] = getattr(self, field_name)

        return attr_dict

进行测试,
在这里插入图片描述
现在get-profile接口就完成了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值