項(xiàng)目里的數(shù)據(jù)錄入就不記錄了帕涌,直接跳到序列化和視圖函數(shù)的編寫(xiě)
1.序列化
假設(shè)我們有一個(gè)類(lèi)如下噩茄,有若干屬性
from datetime import datetime
class Comment(object):
def __init__(self, email, content, created=None):
self.email = email
self.content = content
self.created = created or datetime.now()
comment = Comment(email='test@example.com', content='foo bar')
最初步的序列化我們就用drf本身的serializer
from rest_framework import serializers
class CommentSerializer(serializers.Serializer):
email = serializers.EmailField()
content = serializers.CharField(max_length=200)
created = serializers.DateTimeField()
這樣下面,我們得出的序列化后的結(jié)果就是
serializer = CommentSerializer(comment)
serializer.data
# {'email': 'test@example.com', 'content': 'foo bar', 'created': '2020-05-10T12:07:10.375877'}
2.APIVIEW視圖
上面的基礎(chǔ)序列化講完了以后,我們來(lái)看和本身模型結(jié)合的事情.
首先在我們goods這個(gè)app下面創(chuàng)建serializer.py
from rest_framework import serializers
class GoodsSerializer(serializers.Serializer):
name = serializers.CharField(required=True,max_length=100)
click_num = serializers.IntegerField(default=0)
goods_front_image = serializers.ImageField(default=0)
需要注意的是绩聘,要將基礎(chǔ)序列化和Model結(jié)合使用沥割,你在serializer里面的字段耗啦,必須要和Model的字段相匹配,不一定要全寫(xiě)上机杜,但是serializer有的字段帜讲,必須Model里面要有,不然會(huì)報(bào)錯(cuò)
接著看views.py里面如何編寫(xiě)函數(shù)
from .serializer import GoodsSerializer
from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.response import Response
from .models import Goods
# Create your views here.
class GoodsListView(APIView):
'''
List all
'''
def get(self,request,format=None):
goods = Goods.objects.all()[:10]
goods_serializer = GoodsSerializer(goods,many=True)
return Response(goods_serializer.data)
接著在urls.py里面設(shè)置路由
urlpatterns = [
path('xadmin/', xadmin.site.urls),
path('ueditor/',include('DjangoUeditor.urls')),
path('api-auth/',include('rest_framework.urls',namespace='rest_framework')),
#商品列表
path('goods/',GoodsListView.as_view(),name='goods-list'),]
這樣我們就定義完了 127.0.0.1:8000/goods/
這個(gè)鏈接
我們來(lái)看一下訪問(wèn)后的效果
可以看到我們?cè)趕erializer里面設(shè)置的字段椒拗,都顯示出來(lái)了
3.ModelSerializer
上面是用基礎(chǔ)serializer和模型進(jìn)行匹配使用似将,那么是否有更加簡(jiǎn)單些的方法來(lái)使用呢?不用手動(dòng)寫(xiě)這么多fields蚀苛?
那就是ModelSerializer
class GoodsSerializer(serializers.ModelSerializer):
class Meta:
model = Goods
fields = ('name','click_num','market_price','add_time')
這個(gè)用法就是和ModelForm一樣的在验,規(guī)定好fields,寫(xiě)好對(duì)應(yīng)的model
并把Serializer改成ModelSerializer
如果你將fields設(shè)置為 'all'
那么他就可以把所有的fields都顯示出來(lái)
不過(guò)可以看到category只顯示了一個(gè)數(shù)字id堵未,因?yàn)樗且粋€(gè)外鍵腋舌,那是否可以把這樣的外鍵內(nèi)容也顯示出來(lái)呢?
那就需要再多創(chuàng)建一個(gè)CategorySerializer
class CategorySerializer(serializers.ModelSerializer):
class Meta:
model = GoodsCategory
fields = '__all__'
class GoodsSerializer(serializers.ModelSerializer):
category = CategorySerializer()
class Meta:
model = Goods
fields = '__all__'
這樣渗蟹,就可以把具體的category內(nèi)容顯示出來(lái)了