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接口就完成了