rest-framework序列化
阿新 • • 發佈:2018-06-19
cts app itl round 其他 style 設定 back 序列
將數據顯示到頁面上,在後端需要對其及進行序列化處理
1.用原生的HttpResponse處理
from django.views import View from app01 import models import json class BookView(View): def get(self,request): book_obj=models.Book.objects.all() #將每個對象都取出來,放到列表中,序列化後返回 temp=[] for obj in book_obj: temp.append({"pk":obj.pk, "title":obj.title }) return HttpResponse(json.dumps(temp))
2.使用rest_framework的響應處理
from rest_framework.response import Response class BookView(View): def get(self,request): book_obj=models.Book.objects.all() #將每個對象都取出來,放到列表中,序列化後返回 temp=[] for obj in book_obj: temp.append({ "pk":obj.pk, "title":obj.title }) return Response(json.dumps(temp))
同時在INSTALLED_APPS加入"rest_framework",上述方法不足之處:當字段很多時,我們要寫入多個字段,不方便
使用restframework進行序列化
方法一:model_to_dict(obj)
class BookView(APIView): defget(self,request): book_obj=models.Book.objects.all() from django.forms.models import model_to_dict temp = [] for book in book_obj: temp.append(model_to_dict(book)) return Response(json.dumps(temp)) 頁面顯示:"[{\"id\": 2, \"title\": \"python\"}, {\"id\": 3, \"title\": \"go\"}]"
方法二:serialize
class BookView(APIView):
def get(self,request):
book_obj=models.Book.objects.all()
from django.core.serializers import serialize
ret=serialize("json",book_obj)
return Response(ret)
"[{\"model\": \"app01.book\", \"pk\": 2, \"fields\": {\"title\": \"python\"}},
{\"model\": \"app01.book\", \"pk\": 3, \"fields\": {\"title\": \"go\"}}]"
方法三:序列化組件 rest_framework組件中serializers,使用如同form組件:
自定義類,繼承serializers
rom rest_framework import serializers class BookSerializers(serializers.Serializer): title=serializers.CharField(max_length=32)
class BookView(APIView): def get(self,request): book_list=models.Book.objects.all() bs = BookSerializers(book_list, many=True) return Response(bs.data)
如果要顯示其他的字段就在BookSerializers設定其他的字段
在設定ForeignKey和ManyToManyField的操作:
ForeignKey:
publish=serializers.CharField(max_length=32,source="publish.name")
設置source,可任意設置要顯示的對象屬性。如果模型表中國沒設置返回name,這裏也沒設置source
則顯示:
{ "title": "python", "price": "110.00", "publish": "Publish object" }
ManyToManyField:
如果使用ForeignKey的顯示方式,則應該:
authors=serializers.CharField(max_length=32,source="authors.all")
頁面上的作者顯示的都是具體的對象:
[ { "title": "python", "price": "110.00", "publish": "北京出版社", "authors": "<QuerySet [<Author: jerd>, <Author: jerry>]>" }, { "title": "go", "price": "110.00", "publish": "天青煙雨出版社", "authors": "<QuerySet [<Author: jerry>]>" } ]
而我們需要顯示的是對應的作者對象姓名,定義get_+字段名函數
authors=serializers.SerializerMethodField() def get_authors(self,obj): temp=[] for obj in obj.authors.all(): temp.append(obj.name) return temp
[ { "title": "python", "price": "110.00", "publish": "北京出版社", "authors": [ "jerd", "jerry" ] }, { "title": "go", "price": "110.00", "publish": "天青煙雨出版社", "authors": [ "jerry" ] } ]
bs=BookSerializers(book_list,many=True)的效果等同於
temp=[] for obj in book_list: temp.append({ ‘title‘:obj.title, ‘price‘:obj.price, ‘publish‘:obj.publish.name, ‘authors‘: }) bs.data=json.dumps(temp)
rest-framework序列化