地址管理
实现用户地址的管理,主要业务逻辑:
- 省市区地址的数据库的建立与查询
- 用户地址的增删改查处理
- 设置默认地址
- 设置地址标题
在用户录入地址时,需要进行省市区的选择。在页面加载时,向后端请求省份数据,当用户选择确定省份后,向后端请求该省份的城市数据;在用户选择确定城市数据后,向后端请求该城市的区县信息。这个过程称为省市区三级联动。
省市区地址的三级联动:
创建省市区的数据表,采用自关联的方式;
数据表设计:
- 自关联字段的外键指向自身, ForeignKey(‘self’)
- 使用 related_name 指明查询一个行政区划的所有下级行政区划时,使用哪种语法查询;
迁移数据库,导入数据
-
请求有两种方式:
'list'
,'retrieve'
,list
请求省份数据,retrieve
根据上级 id 请求数据; -
让视图继承自
ReadOnlyModelViewSet
,这个视图集继承自'mixins.RetrieveModelMixin,mixins.ListModelMixin,GenericViewSet',
会自动执行 list(多条数据)和 retrieve(单个数据)的查询; -
重写
get_queryset
和get_serializer_class
方法,进行判断,对应两种请求方式来写对应的 查询结果集 和 序列化器; -
list 的查询结果集和序列化器没什么难度,
-
retrieve 的查询结果集在底层会自动以 id 为过滤条件来进行重新查询,
class RetrieveModelMixin(object):
"""
Retrieve a model instance.
"""
def retrieve(self, request, *args, **kwargs):
instance = self.get_object() # 返回过滤过的查询结果集
serializer = self.get_serializer(instance)
return Response(serializer.data)
-
retrieve 的序列化器需要查询出子级信息 subs,进行返回;
-
城市信息和区划信息是同一个接口
使用缓存
省市区的数据是经常被用户查询使用的,而且数据基本不变化,所以我们可以将省市区数据进行缓存处理,减少数据库的查询次数。
在Django REST framework中使用缓存,可以通过drf-extensions扩展来实现。
因为省市区视图使用了视图集,并且视图集中有提供ListModelMixin和RetrieveModelMixin的扩展(由ReadOnlyModelViewSet提供),所以可以直接添加CacheResponseMixin扩展类,就相当于在 list 和 retrieve 方法添加了装饰器 @cache_response,就可以使用缓存了
在配置文件中设置将缓存数据保存在 redis 中,设置有效期
当数据库进行查询时,会将缓存保存在 redis 中,下一次请求时会优先访问缓存
用户地址管理:
创建用户地址模型类,
添加视图:用户地址列表数据,保存用户地址数据,处理删除(逻辑删除),设置默认地址,修改标题
添加对应序列化器