1.django的view实现商品列表页
(1)goods/view_base.py
在goods文件夹下面新建view_base.py,为了区分django和django rest framework的view
利用Django的view实现返回json数据
# goods/view_base.py
from django.views.generic import View
from goods.models import Goods
class GoodsListView(View):
def get(self,request):#默认传入一个request进来
#通过django的view实现商品列表页
json_list = []
#获取所有商品
goods = Goods.objects.all()
for good in goods:
json_dict = {}
#获取商品的每个字段,键值对形式
json_dict['name'] = good.name
json_dict['category'] = good.category.name
json_dict['market_price'] = good.market_price
json_list.append(json_dict)
# 将获取到的数据返回到 json中
from django.http import HttpResponse
import json
#返回json,一定要指定类型content_type='application/json'
return HttpResponse(json.dumps(json_list),content_type='application/json')
#用json.dumps(json_list)将json_list进行序列化
(2)配置到url中(MxShop/urls.py)
from goods.view_base import GoodsListView
urlpatterns = [
#商品列表页
path('goods/',GoodsListView.as_view(),name='goods-list')
]
访问http://127.0.0.1:8000/goods/ 可以获取商品列表信息的json数据(下载谷歌插件-jsonview)
存在的问题:
(1)当字段比较多时,一个字段一个字段的提取很麻烦
(2)如果将字段‘add_time’添加就会报错,因为json.dumps就是datatime类型,所以会报错。
(3)对ImageFieldFile序列化也会报错及其他问题
2.django的serializer序列化model
(1)model_to_dict 将django中的model对象转换为dict
当字段比较多时,一个字段一个字段的提取很麻烦,可以用model_to_dict,将model整个转化为dict
# goods/view_base.py
from django.views.generic import View
from goods.models import Goods
class GoodsListView(View):
def get(self,request):
#通过django的view实现商品列表页
json_list = []
#获取所有商品
goods = Goods.objects.all()
# for good in goods:
# json_dict = {}
# #获取商品的每个字段,键值对形式
# json_dict['name'] = good.name
# json_dict['category'] = good.category.name
# json_dict['market_price'] = good.market_price
# json_list.append(json_dict)
from django.forms.models import model_to_dict
for good in goods:
json_dict = model_to_dict(good)
json_list.append(json_dict)
from django.http import HttpResponse
import json
#返回json,一定要指定类型content_type='application/json'
return HttpResponse(json.dumps(json_list),content_type='application/json')
但是这样有个问题,就是ImageFieldFile 和add_time字段不能序列化
如何才能将所有字段序列化呢?就要用到django的serializers
(2)django serializer的用法
# goods/view_base.py
from django.views.generic import View
from goods.models import Goods
class GoodsListView(View):
def get(self,request):
#通过django的view实现商品列表页
json_list = []
#获取所有商品
goods = Goods.objects.all()
# for good in goods:
# json_dict = {}
# #获取商品的每个字段,键值对形式
# json_dict['name'] = good.name
# json_dict['category'] = good.category.name
# json_dict['market_price'] = good.market_price
# json_list.append(json_dict)
import json
from django.core import serializers
from django.http import JsonResponse
json_data = serializers.serialize('json',goods)
json_data = json.loads(json_data)
#In order to allow non-dict objects to be serialized set the safe parameter to False.
return JsonResponse(json_data,safe=False)
django的serializer虽然可以很简单实现序列化,但是有几个缺点
(1)字段序列化定死的,要想重组的话非常麻烦
(2)从上面截图可以看出来,images保存的是一个相对路径,我们还需要补全路径,而这些drf都可以帮助我们做到