python测试开发django-rest-framework-94.序列化(ModelSerializer)之嵌套对象
前言
前面一篇在查询我的收藏的时候,只显示了商品的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收藏
查询的时候返回详情
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2019-01-31 python测试开发django-19.admin后台自定义显示
2019-01-31 python测试开发django-18.admin后台中文版
2019-01-31 python测试开发django-17.admin后台管理
2019-01-31 python笔记34-类里面的__str__ 和__unicode__作用
2018-01-31 selenium+python自动化90-unittest多线程执行用例