(生鲜项目)06. django的view实现商品列表页
使用原始的django的View来返回json格式的商品列表
目的是回顾一些django的基础知识, 好与后面的RESTful做对比
goods.views_base.py
from django.views.generic.base import View
# from django.views.generic import ListView
from goods.models import Goods
class GoodsListView(View):
def get(self, request):
"""
通过django的view实现商品列表页
:param request:
:return:
"""
json_list = []
goods = Goods.objects.all()[:10]
# 方式一: 手动一个个赋值给dict
# import json
# from django.http import HttpResponse
# 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_dict["add_time"] = good.add_time
# # 这里的add_time是datetime.datetime()对象,json并不支持对其序列化, 此外也不支持ImageField
# json_list.append(json_dict)
# return HttpResponse(json.dumps(json_list), content_type="application/json")
# 方式二: 使用model_to_dict一次性返回对象的key和value字典, 同样,json不支持对image和datetime的序列化
# import json
# from django.http import HttpResponse
# from django.forms.models import model_to_dict
# for good in goods:
# good_dict=model_to_dict(good)
# json_list.append(good_dict)
# return HttpResponse(json.dumps(json_list), content_type="application/json")
# 方式三: 使用django自带的serializers序列化工具
# serialize(format, queryset, **options) 可直接对多个对象进行操作,
import json
from django.core import serializers
from django.http import HttpResponse, JsonResponse
json_data = serializers.serialize("json",goods) # 此时的json_data就是一个json格式的列表,每一个元素都是一个对象封装成的一个dict,可见一行代码就达到了目的
json_data = json.loads(json_data)
return JsonResponse(json_data,safe=False) # safe默认为true,即默认只能序列化dict格式的,但现在我们需要序列化list格式的
以上使用django自带的3种方法实现了json字符串的返回, 但我们可以从返回的结果中看出一些问题, 见下图
所以, 因为直接返回json的种种不方便, 我们才需要使用RESTful,
----- over ----