django model的序列化

本文探讨了在Django框架中将model数据序列化为JSON格式的多种方法,包括原始序列化、使用model_to_dict及serialize函数,以及推荐的Django Rest Framework方案。

网络传输数据现在流行的是json数据格式,所以非常需要将数据库查询的到对象数据序列化成json格式,然后返回给前端进行数据展示。

下面讨论在django中如何更方便的将model 序列化。

一个goods的modle如下。

 class Goods(models.Model):
    name = models.CharField(max_length=100, verbose_name="商品名")
    market_price = models.FloatField(default=0, verbose_name="市场价格")
    goods_front_image = models.ImageField(upload_to="goods/images/", null=True, blank=True, verbose_name="封面图")    
    .....

序列化一. 最原始的model序列化,比较繁琐…太不智能了.

goodList = Goods.objects.all()[:10]
for good in goodList:
    json_dict = {}
    json_dict["name"] = good.name                    
    json_dict["market_price"] = good.market_price
    json_dict["add_time"] = good.add_time
    json_list.append(json_dict)

序列化二.

from django.forms.models import model_to_dict

goodsList = Goods.objects.all()[:10]
for goods in goodsList:    json_list.append(model_to_dict(good))

通过使用model_to_dict 更方便的去序列化goods对象。唯一不足的是无法序列化ImageField字段。

在这里插入图片描述

序列化三.

goodsList = Goods.objects.all()[:10]
goods_json = serialize('json', goodList)

直接将整个goods list 进行序列化,更加方便的使用。但是虽然能够将ImageField序列化,但是得到的图片路径是从数据库中拿到的,并不是图片真实的路径,前端拿到后需要做处理才能使用。

在这里插入图片描述

最后,还有没有更方便的序列化方式呢,当然有,去了解下djangorestframework吧,后期我也会有写关于该框架的博客。

欢迎关注,互相学习,共同进步~

我的个人博客

我的微信公众号:编程黑洞

### 使用 Django REST Framework 进行数据序列化Django REST Framework (DRF) 中,`serializers` 模块专门用于处理数据的序列化和反序列化操作。这使得开发者可以轻松地将复杂的数据库查询集转换为 JSON 或其他内容类型的数据,并能够方便地解析传入的数据来更新模型实例。 #### 创建自定义序列化器 为了实现这一点,通常会在应用程序目录下创建一个名为 `serializers.py` 的文件,在其中定义所需的序列化器类: ```python from rest_framework import serializers from .models import MyModel class MyModelSerializer(serializers.ModelSerializer): class Meta: model = MyModel fields = '__all__' # 可以指定具体字段列表 ['field1', 'field2'] ``` 此代码片段展示了如何基于现有的 Django 模型快速构建一个简单的序列化器[^3]。 #### 实现序列化功能 当需要返回给客户端时,可以通过传递模型实例给序列化器来进行序列化操作。下面是一个视图函数的例子,它获取特定用户的详情并将其作为 JSON 响应发送回去: ```python from rest_framework.views import APIView from rest_framework.response import Response from django.shortcuts import get_object_or_404 from .models import UserModel from .serializers import UserSerializer class UserIdView(APIView): def get(self, request, id): user = get_object_or_404(UserModel, pk=id) serializer = UserSerializer(user) return Response(serializer.data) ``` 这段代码实现了单条记录的序列化过程,即从数据库中检索一条用户信息并通过 HTTP GET 请求响应给前端应用[^5]。 #### 处理反序列化请求 对于 POST 和 PUT 方法来说,则涉及到接收来自客户端提交的信息并将这些原始输入转化为有效的 Python 对象或保存到数据库中。这里展示了一个接受新资源创建的方法: ```python def post(self, request): serializer = UserSerializer(data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=201) return Response(serializer.errors, status=400) ``` 在这个例子中,首先尝试使用接收到的数据初始化一个新的 `UserSerializer` 实例;如果验证通过(`is_valid()` 返回 True),则调用 `save()` 来持久化新的实体至数据库,并向客户反馈成功消息以及刚创建的对象表示形式;反之,若存在错误,则告知客户端哪些地方不符合预期[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值