最近搜索

django 序列化 返回json 格式数据。

浏览:26
管理员 2026-05-13 19:15



api接口设计  


django 序列化  返回json 格式数据。

@csrf_exempt
def api_nav_head_find_id(request):
    try:
        data = request.POST if request.method == "POST" else request.GET
        id = data.get('id')

        # 1. 获取导航头
        nav_head = NavHead.objects.get(id=id)

        # 2. 获取该导航头下的所有导航列表
        nav_list = Nav.objects.filter(nav_head=nav_head)

        # 3. 使用序列化器格式化数据(你之前定义的序列化器直接用)
        nav_head_data = NavHeadSerializer(nav_head).data

        # 4. 把子导航列表塞进结果里
        nav_head_data["nav_list"] = NavSerializer(nav_list, many=True).data

        # 5. 返回前端
        return JsonResponse({
            "success": True,
            "nav_head": nav_head_data
        })

    except Exception as e:
        return JsonResponse({
            "success": False,
            "msg": f"获取失败:{str(e)}"
        })





实体 一对一 关联 

from django.db import models
from django.utils import timezone
from rest_framework import serializers

from xcx_user.models import XcxUser


# 管理农活的位置

# Create your models here.
class NavHead(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=100, null=True, verbose_name="name")
    name2 = models.CharField(max_length=100, null=True, verbose_name="name2")
    click_url = models.CharField(max_length=100, null=True, verbose_name="click_url")  # name2跳转地址
    show_name = models.IntegerField(default=0, verbose_name="show_name")  # 是否显示头的name 0不显示 1显示

    bianhao = models.CharField(max_length=100, null=True, verbose_name="bianhao")
    jump_type = models.IntegerField(default=1, verbose_name="jump_type")  # 跳转类型  一种1是跳转页面 一种2是switchTab
    num = models.IntegerField(default=0, verbose_name="num")  # 一行几个菜单

    state = models.IntegerField(default=0, verbose_name="state")  # 0未审核  1审核可以显示。
    order_num = models.IntegerField(default=0, verbose_name="order_num")  # 排序

    # default=timezone.now 创建记录是,自动有时间。
    create_time = models.DateTimeField('创建时间', default=timezone.now)
    # auto_now=True 每当这个模型的实例(一条数据)被保存 / 更新时,该字段会自动被设置为当前的系统时间,且这个过程是完全自动的,无需你手动赋值。
    update_time = models.DateTimeField('更新时间', auto_now=True)
    remark = models.CharField(max_length=500, null=True, verbose_name="备注")

    # 魔法方法 输出的时候  打印 name
    def __str__(self):
        return self.name

    class Meta:
        db_table = "t_nav_head"


class Nav(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=100, null=True, verbose_name="name")
    click_url = models.CharField(max_length=100, null=True, verbose_name="click_url")  # name2跳转地址
    img_url = models.CharField(max_length=500, null=True, verbose_name="img_url")
    jump_type = models.IntegerField(default=1, verbose_name="jump_type")  # 跳转类型  一种1是跳转页面 一种2是switchTab

    nav_head = models.ForeignKey(NavHead, null=True, on_delete=models.PROTECT)  # 属于哪个 菜单头
    state = models.IntegerField(default=0, verbose_name="state")  # 0未审核  1审核可以显示。
    order_num = models.IntegerField(default=0, verbose_name="order_num")  # 排序
    # default=timezone.now 创建记录是,自动有时间。
    create_time = models.DateTimeField('创建时间', default=timezone.now)
    # auto_now=True 每当这个模型的实例(一条数据)被保存 / 更新时,该字段会自动被设置为当前的系统时间,且这个过程是完全自动的,无需你手动赋值。
    update_time = models.DateTimeField('更新时间', auto_now=True)

    remark = models.CharField(max_length=500, null=True, verbose_name="备注")

    # 魔法方法 输出的时候  打印 name
    def __str__(self):
        return self.name

    class Meta:
        db_table = "t_nav"


#  NavHead 序列化器
class NavHeadSerializer(serializers.ModelSerializer):
    create_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S")
    update_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S")

    class Meta:
        model = NavHead
        fields = '__all__'


#  Nav  序列化器
class NavSerializer(serializers.ModelSerializer):
    # 关键:嵌套序列化器
    nav_head = NavHeadSerializer(read_only=True)
    create_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S")
    update_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S")

    class Meta:
        model = Nav
        fields = '__all__'


返回nav 会携带nav_head





最原始的方法 返回序列化  组装数据

# ===================== 新增:通过主键 id 获取用户信息 =====================
@csrf_exempt
def get_user_by_id(request):
    """
    接口:通过主键 id 获取小程序用户信息
    支持:GET / POST
    参数:id
    """
    # 统一获取参数(兼容 GET/POST)
    id_str = request.GET.get("id", "") or request.POST.get("id", "")
    id_str = id_str.strip()

    if not id_str:
        return JsonResponse({
            "code": 1,
            "msg": "缺少 id 参数",
            "data": None
        }, json_dumps_params={'ensure_ascii': False})

    # 校验 id 是数字
    if not id_str.isdigit():
        return JsonResponse({
            "code": 1,
            "msg": "id 必须为数字",
            "data": None
        }, json_dumps_params={'ensure_ascii': False})

    user_id = int(id_str)

    try:
        # 只查 用户
        user = XcxUser.objects.get(id=user_id)

        # 组装返回数据
        user_data = {
            "id": user.id,
            "openid": user.openid,
            "sex": user.sex,
            "true_name": user.true_name,
            "phone": user.phone,
            "sfz": user.sfz,
            "status": user.status,
            "headimgurl": user.headimgurl,
            "balance": str(user.balance),
            "create_time": format_data_time([user.create_time])[0] if user.create_time else "",
            "update_time": format_data_time([user.update_time])[0] if user.update_time else "",
            "remark": user.remark
        }

        return JsonResponse({
            "code": 0,
            "msg": "获取成功",
            "data": user_data
        }, json_dumps_params={'ensure_ascii': False})

    except XcxUser.DoesNotExist:
        return JsonResponse({
            "code": 1,
            "msg": "用户不存在",
            "data": None
        }, json_dumps_params={'ensure_ascii': False})
    except Exception as e:
        return JsonResponse({
            "code": 1,
            "msg": f"获取失败:{str(e)}",
            "data": None
        }, json_dumps_params={'ensure_ascii': False})


联系站长

站长微信:xiaomao0055

站长QQ:14496453