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)
image.png
存在的問題:
(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字段不能序列化
image.png
如何才能將所有字段序列化呢?就要用到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)
image.png
django的serializer雖然可以很簡單實現序列化,但是有幾個缺點
(1)字段序列化定死的,要想重組的話非常麻煩
(2)從上面截圖可以看出來,images保存的是一個相對路徑,我們還需要補全路徑,而這些drf都可以幫助我們做到