python测试开发django-rest-framework-94.嵌套对象

前言

前面一篇在查询我的收藏的时候,只显示了商品的id和收藏状态,并没有显示商品的详情。如果我们想查询的结果显示商品的详情,需关联到商品表。

嵌套对象

我们在查询的时候,希望能显示商品的详情

于是可以在序列化的时候嵌套

from .models import Goods, UserCollect
from rest_framework import validators
# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/

class GoodsSerializer(serializers.ModelSerializer):
"""序列化商品models"""
create_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S', required=False)
update_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S', required=False)

# 必传字段
goods_code = serializers.CharField(required=True,
max_length=15,
min_length=8,
validators=[validators.UniqueValidator(queryset=Goods.objects.all(),
message="goods_code 已存在")]
)

class Meta:
model = Goods
fields = '__all__' # 返回全部的字段

class UserCollectSerializer(serializers.ModelSerializer):
# 获取当前登录的用户
user = serializers.HiddenField(
default=serializers.CurrentUserDefault()
)
status = serializers.ChoiceField(choices=(
(0, '取消收藏'),
(1, '已收藏')
),
read_only=True)
create_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S', required=False)
update_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S', required=False)
# 嵌套商品序列化
goods = GoodsSerializer()

def to_representation(self, instance):
"""to_representation自定义序列化数据的返回"""
data = super().to_representation(instance)
data.update(status=instance.get_status_display())
return data

class Meta:
# validate实现唯一联合,一个商品只能收藏一次
validators = [
validators.UniqueTogetherValidator(
queryset=UserCollect.objects.all(),
fields=('user', 'goods'),
# message的信息可以自定义
message="已收藏"
)
]
model = UserCollect
# 收藏的时候需要返回商品的id,因为取消收藏的时候必须知道商品的id是多少
fields = '__all__' # 返回全部的字段

此时查询全部,可以显示关联的商品详情

虽然查询没问题,但是在收藏提交商品id的时候,会要求提交dict数据,这不是我们期望的

自定义查询字段

我们希望在收藏的时候,还是提交商品的id,查询的时候能显示详情,于是可以优化下,自定义查询用到get_<字段名称>

# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/

class UserCollectSerializer(serializers.ModelSerializer):
# 获取当前登录的用户
user = serializers.HiddenField(
default=serializers.CurrentUserDefault()
)
status = serializers.ChoiceField(choices=(
(0, '取消收藏'),
(1, '已收藏')
),
read_only=True)
create_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S', required=False)
update_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S', required=False)
# 添加个goods_detail
goods_detail = serializers.SerializerMethodField()

def get_goods_detail(self, obj):
"""查询商品表详情"""
return GoodsSerializer(instance=obj.goods).data

def to_representation(self, instance):
"""to_representation自定义序列化数据的返回"""
data = super().to_representation(instance)
data.update(status=instance.get_status_display())
return data

class Meta:
# validate实现唯一联合,一个商品只能收藏一次
validators = [
validators.UniqueTogetherValidator(
queryset=UserCollect.objects.all(),
fields=('user', 'goods'),
# message的信息可以自定义
message="已收藏"
)
]
model = UserCollect
# 收藏的时候需要返回商品的id,因为取消收藏的时候必须知道商品的id是多少
fields = '__all__' # 返回全部的字段

收藏的时候根据商品id收藏

查询的时候返回详情

2021年第六期《python接口自动化+测试开发》课程,1月9号开学(火热报名中!)

本期上课时间:1月9号-4月18号,每周六、周日晚上20:30-22:30

(0)

相关推荐

  • ECSHOP添加字段并实现商品批量上传

    用了半个小时就实现了整个过程.可见,ECSHOP的二次开发还是非常快速方便的. 以下是一些重要的步骤,仅供参考: 添加ecs_goods表中的自定义字段 ALTER TABLE `ecs_goods` ...

  • 数据透视表计算项和计算段的详解

    计算字段是通过对表中现有的字段执行计算后得到的新的字段: 计算项则是在已有的字段中插入新的项,是通过对该字段现有的其他项执行计算后得到的. 一旦创建了自定义的字段或项,Excel就允许在表格中使用它们 ...

  • Django-Vue搭建个人博客:Markdown正文

    原创 杜赛 杜赛说编程 博客文章需要排版,否则难以凸显标题.正文.注释等内容之间的区别.作为博客写手来说,比较流行且好用的排版是采用 Markdown 语法. 严格来说, Markdown 是一种排版 ...

  • PROJECT 如何让工期显示成“天”

    前言 PROJECT中的日期格式和周期显示格式非常有限,且不能自定义, 工期显示单位明明是"天",但你的工期仍然显示成诸如d,dy,day,个工作日,这个选项在高级里面,如下图所示 ...

  • 关于排序,你未必都会!

    前言 简单排序 如果是单一的简单排序,直接用鼠标点点就能搞定 步骤: 1.  选择需要排序的列字段任意单元格 2.  点击工具栏数据中的A-Z升序,或Z-A降序 多字段排序 1.  选择数据 2.  ...

  • 能解决90%难题的数据模型——手把手教你学会帕累托模型

    大家一定在网上听到过下面这样的现象: 世界上80%的资源被20%的人消耗了:美国20%的人垄断了全国80%的财富:一个企业20%的资源投入产生了80%的效益...... 其实这些现象的背后都存在着一个 ...

  • python测试开发django -140.Bootstrap 缩略图

    前言 网格中布局图像.视频.文本等.Bootstrap 通过缩略图为此提供了一种简便的方式.使用 Bootstrap 创建缩略图的步骤如下: 在图像周围添加带有 class .thumbnail 的& ...

  • python测试开发django -143.Bootstrap 表单控件校验状态

    前言 Bootstrap 对表单控件的校验状态,如 error.warning 和 success 状态,都定义了样式.使用时,添加 .has-warning..has-error 或 .has-su ...

  • python测试开发django -142.Bootstrap 表单(form)

    前言 HTML 表单用于收集不同类型的用户输入.boostrap中表单有几种样式 基本垂直表单 内联表单 form-inline 水平排列表单 form-horizontal 基本表单实例 单独的表单 ...

  • python测试开发django -141.Bootstrap 面板(Panels)

    # 前言 面板组件用于把 DOM 组件插入到一个盒子中.创建一个基本的面板,只需要向 元素添加 class .panel 和 class .panel-default 即可 基础面板 不带标题的基本面 ...

  • python测试开发django -144.Ace Editor 在线编辑python代码

    前言 网页上想在线编辑代码,可以使用Ace Editor 在线编辑实现.比如我们想实现一个功能,在网页版上写python代码,能有python的语法自动补齐功能. Ace Editor 在线编辑 AC ...

  • python测试开发django-10.django连接mysql

    前言 Django 对各种数据库提供了很好的支持,包括:PostgreSQL.MySQL.SQLite.Oracle.本篇以mysql为例简单介绍django连接mysql进行数据操作 Django连 ...

  • python测试开发django-73.django视图 CBV 和 FBV

    前言 FBV(function base views) 就是在视图里使用函数处理请求,这一般是学django入门的时候开始使用的方式. CBV(class base views) 就是在视图里使用类处 ...

  • python测试开发django-83.Dockerfile部署django项目

    前言 现在流行用 docker 部署环境,python 开发的 django 项目也可以写个 Dockefile 文件,方便docker部署. django 是依赖于python环境的,所有镜像制作是 ...

  • python测试开发django-1.开始hello world!

    前言 当你想走上测试开发之路,用python开发出一个web页面的时候,需要找一个支持python语言的web框架.django框架有丰富的文档和学习资料,也是非常成熟的web开发框架,想学pytho ...