![42bb6ddb9ec1e693f0c34ce6a1fbafe7.png](https://i-blog.csdnimg.cn/blog_migrate/28b3d643503e2afb6116faa8ea599a4e.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 的功能远不止这些。