前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python测试开发django-rest-framework-94.嵌套对象

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

作者头像
上海-悠悠
发布2021-02-03 10:01:23
7220
发布2021-02-03 10:01:23
举报
文章被收录于专栏:从零开始学自动化测试

前言

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

嵌套对象

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

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

代码语言:javascript
复制
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_<字段名称>

代码语言:javascript
复制
# 作者-上海悠悠 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-02-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 从零开始学自动化测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 嵌套对象
  • 自定义查询字段
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档