app.vue里使用data_DRF|为啥要使用 DRF?

42bb6ddb9ec1e693f0c34ce6a1fbafe7.png

在使用 Django 开发接口过程中,既然有 Django 为什么还要使用 Django REST framework (以下简称DRF),DRF 到底有什么优点呢?下面我们来看一个例子。

model:

class Goods(models.Model):
    """
    商品
    """
    goods_sn = models.CharField(max_length=50, default="", verbose_name="商品唯一编号")
    name = models.CharField(max_length=300, verbose_name="商品名")
    market_price = models.FloatField(default=0, verbose_name="市场价格")
    shop_price = models.FloatField(default=0, verbose_name="本店价格")
    add_time = models.DateTimeField(default=datetime.now, verbose_name="添加时间")

    class Meta:
        verbose_name = "商品"
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name

Django 的 View 实现列表页

这里主要实现 json 数据的返回。首先循环取出数据,写入列表,再用 json 序列化。

class GoodsListView(View):
    def get(self, request):
        data_list = []
        goods = Goods.objects.all()[:10]
        for good in goods:
            json_dict = {}
            json_dict['name'] = good.name
            json_dict['shop_price'] = good.shop_price
            json_dict['market_price'] = good.market_price
            data_list.append(json_dict)

        return HttpResponse(json.dumps(data_list), content_type='application/json')

这样似乎很容易就实现数据 json 序列化返回,可是也有很大的不足:

  • 遇到字段特别多的时候,需要挨个取出字段,既麻烦又容易出错 。
  • DateTimeField 类型的字段取法序列化。
Exception Value: Object of type datetime is not JSON serializable

字段特别多的时候,Django 里有没有其他方法解决呢?

from django.views.generic.base import View
from django.forms.models import model_to_dict
class GoodsListBaseView(View):
    def get(self, request):
        data_list = []
        goods = Goods.objects.all()[:10]
        for good in goods:
            json_dict = model_to_dict(good)
            data_list.append(json_dict)
        json_data = json.dumps(data_list)
        return HttpResponse(json_data, content_type="application/json")

model_to_dict: 既方便又不容易出错的取出model里的所有字段。但是对于 DateTimeField、ImageField 类型的字段 json 序列化的时候还是会报错。

那 Django 有没有可以序列化所有字段的方法呢?当然有。

from django.core import serializers
from django.http import JsonResponse,HttpResponse

class GoodsListBaseView(View):
    def get(self, request):
        goods = Goods.objects.all()[:10]
        json_data = serializers.serialize("json", goods)
        return HttpResponse(json_data, content_type="application/json")
        
        # 还可以用JsonResponse
        # json_data = json.loads(json_data)
        # return HttpResponse(json_data)

使用 Django 自带的 serializers 可以方便、高效、准确的序列化所有字段。到这里似乎满足我们的所有要求,其实不然,实际开发中还会有许多别的需求。

  • 比如前端开发人员通过上面的接口去拿数据,拿到后还需要自己拼接域名。
http://127.0.0.1:8000/ + media/ + goods/images/1_P_1449024889287.jpg
  • 其次是序列化后的结果字段是固定的,缺乏灵活性。
model: "goods.goods",
pk: 3,
fields: {}
  • 文档自动生成,输入检测等。

而以上这些功能,DRF 都为开发者实现了,然而,DRF 的功能远不止这些。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值