1.django完成商品列表页

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都可以帮助我们做到

以上写了这么多只是为了引入django rest framework和简单介绍django的序列化用法,下面就是重点讲解django rest framework了

3.APIview方式实现商品列表页

你可能感兴趣的:(1.django完成商品列表页)