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