1. 程式人生 > >rest-framework序列化

rest-framework序列化

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):
    def 
get(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序列化