摘要:為什么要用對于序列化數(shù)據(jù)的解決方案已經(jīng)有以下幾種內(nèi)建序列化器它可以序列化但無法直接序列化多帶帶的數(shù)據(jù)。與對依舊有效默認為用法轉換為字符串。
寫后臺的時候經(jīng)常需要寫數(shù)據(jù)接口,這時就需要用到序列化工具, 而默認到序列化工具對 Django model 的序列化支持有限。 同時 Django 本身的序列化工具我在使用時也覺得有諸多不便,因此我嘗試自己寫了一個快速序列化工具,幫助我快速簡單的實現(xiàn)數(shù)據(jù)接口。
Django Simple Serializer 是一個可以幫助開發(fā)者快速將 Django 數(shù)據(jù)或者 python data 序列化為 json|raw 數(shù)據(jù)的工具。
為什么要用 Django Simple Serializer ?對于序列化 Django 數(shù)據(jù)的解決方案已經(jīng)有以下幾種:
django.core.serializersDjango內(nèi)建序列化器, 它可以序列化Django model query set 但無法直接序列化多帶帶的Django model數(shù)據(jù)。如果你的model里含有混合數(shù)據(jù) , 這個序列化器同樣無法使用(如果你想直接使用序列化數(shù)據(jù)). 除此之外, 如果你想直接把序列化數(shù)據(jù)返回給用戶,顯然它包含了很多敏感及對用戶無用對信息。
QuerySet.values()和上面一樣, 如果你的model里有 DateTimeField 或者其他特殊的 Field 以及額外數(shù)據(jù), QuerySet.values() 同樣沒法工作。
django-rest-framework serializersdjango-rest-framework 是一個可以幫助你快速構建 REST API 的強力框架。 他擁有完善的序列化器,但在使用之前你需要花費一些時間入門, 并學習 cbv 的開發(fā)方式, 對于有時間需求的項目或者已經(jīng)存在的項目需要增加數(shù)據(jù)接口時顯然這不是最好的解決方案。
django simple serializer我希望可以快速簡單的序列化數(shù)據(jù), 所以我設計了一種可以不用任何額外的配置與學習而將Django data 或者 python data 序列化為相應的數(shù)據(jù)的簡單的方式。 這就是為什么我寫了 django simple serializer。
Django >= 1.5
Python 2.5 及以上 (暫不支持 python 3)
安裝Install using pip:
pip install django-simple-serializer使用 django simple serializer 進行開發(fā) 序列化Django data
假設我們有以下Django models:
class Classification(models.Model): c_name = models.CharField(max_length=30, unique=True) class Article(models.Model): caption = models.CharField(max_length=50) classification = models.ForeignKey(Classification, related_name="cls_art") content = models.TextField() publish = models.BooleanField(default=False)
使用django simple serializer的簡單例子:
from dss.Serializer import serializer article_list = Article.objects.all() data = serializer(article_list)
data:
[{"read_count": 0, "create_time": 1432392456.0, "modify_time": 1432392456.0, "sub_caption": u"first", "comment_count": 0, u"id": 31}, {"read_count": 0, "create_time": 1432392499.0, "modify_time": 1432392499.0, "sub_caption": u"second", "comment_count": 0, u"id": 32}]
默認情況下, 序列器會返回一個 list 或者 dict(對于單個model實例), 你可以設置參數(shù) “output_type” 來決定序列器返回 json/raw.
提供序列器
function serializer(data, datetime_format="timestamp", output_type="raw", include_attr=None, except_attr=None, foreign=False, many=False)
Parameters:data(_Required_|(QuerySet, Page, list, django model object))-待處理數(shù)據(jù)
datetime_format(_Optional_|string)-如果包含 datetime 將 datetime 轉換成相應格式.默認為 "timestamp"(時間戳)
output_type(_Optional_|string)-serialize type. 默認“raw”原始數(shù)據(jù),即返回list或dict
include_attr(_Optional_|(list, tuple))-只序列化 include_attr 列表里的字段。默認為 None
exclude_attr(_Optional_|(list, tuple))-不序列化 except_attr 列表里的字段。默認為 None
foreign(_Optional_|bool)-是否序列化 ForeignKeyField 。include_attr 與 exclude_attr 對 ForeignKeyField 依舊有效。 默認為 False
many(_Optional_|bool)-是否序列化 ManyToManyField 。include_attr 與 exclude_attr 對 ManyToManyField 依舊有效 默認為 False
用法:datetime_format:
parameters | intro |
---|---|
string | 轉換 datetime 為字符串。如: "2015-05-10 10:19:22" |
timestamp | 轉換 datetime 為時間戳。如: "1432124420.0" |
例子:
from dss.Serializer import serializer article_list = Article.objects.all() data = serializer(article_list, datetime_format="string", output_type="json")
data:
[ { "read_count": 0, "sub_caption": "first", "publish": true, "content": "first article", "caption": "first", "comment_count": 0, "create_time": "2015-05-23 22:47:36", "modify_time": "2015-05-23 22:47:36", "id": 31 }, { "read_count": 0, "sub_caption": "second", "publish": false, "content": "second article", "caption": "second", "comment_count": 0, "create_time": "2015-05-23 22:48:19", "modify_time": "2015-05-23 22:48:19", "id": 32 } ]
output_type
parameters | intro |
---|---|
raw | 將list或dict中的特殊對象序列化后輸出為list或dict |
dict | 同 raw |
json | 轉換數(shù)據(jù)為 json |
xml 轉換數(shù)據(jù)為 xml (暫時去除)
例子:
from dss.Serializer import serializer article_list = Article.objects.all()[0] data = serializer(article_list, output_type="json")
data:
{ "read_count": 0, "sub_caption": "first", "publish": true, "content": "first article", "caption": "first", "comment_count": 0, "create_time": "2015-05-23 22:47:36", "modify_time": "2015-05-23 22:47:36", "id": 31 }
include_attr
例子:
from dss.Serializer import serializer article_list = Article.objects.all() data = serializer(article_list, output_type="json", include_attr=("content", "caption",))
data:
[ { "content": "first article", "caption": "first" }, { "content": "second article", "caption": "second" } ]
exclude_attr
例子:
from dss.Serializer import serializer article_list = Article.objects.all() data = serializer(article_list, output_type="json", except_attr=("content",))
data:
[ { "read_count": 0, "sub_caption": "first", "publish": true, "caption": "first", "comment_count": 0, "create_time": 1432392456, "modify_time": 1432392456, "id": 31 }, { "read_count": 0, "sub_caption": "second", "publish": false, "caption": "second", "comment_count": 0, "create_time": 1432392499, "modify_time": 1432392499, "id": 32 } ]
foreign
序列化數(shù)據(jù)中的 ForeignKeyField 及其子項目
例子:
from dss.Serializer import serializer article_list = Article.objects.all() data = serializer(article_list, output_type="json", include_attr=("classification", "caption", "create_time", foreign=True)
data:
[ { "caption": "first", "create_time": 1432392456, "classification": { "create_time": 1429708506, "c_name": "python", "id": 1, "modify_time": 1429708506 } }, { "caption": "second", "create_time": 1432392499, "classification": { "create_time": 1430045890, "c_name": "test", "id": 5, "modify_time": 1430045890 } } ]
many
序列化 ManyToManyField
example:
from dss.Serializer import serializer article_list = Article.objects.all() data = serializer(article_list, output_type="json", include_attr=("classification", "caption", "create_time", many=True)
測試數(shù)據(jù)無 ManyToManyField ,數(shù)據(jù)格式同上
dss.Mixin提供序列器 Mixin
class JsonResponseMixin(object) datetime_type = "string" # 輸出datetime時間格式。默認為“string”,可選參數(shù)相見dss.Serializer.serializer foreign = False # 是否序列化ForeignField。默認為False many = False # 是否序列化ManyToManyField。默認為False include_attr = None # 只序列化include_attr包含的屬性。默認為None,接受一個包含屬性名稱的tuple exclude_attr = None # 不序列化exclude_attr包含的屬性。默認為None,接受一個包含屬性名稱的tuple說明:
將普通class based view 轉換為返回json數(shù)據(jù)的class based view,適用于DetailView等
用法:例子:
# view.py from dss.Mixin import JsonResponseMixin from django.views.generic import DetailView from model import Article class TestView(JsonResponseMixin, DetailView): model = Article datetime_type = "string" pk_url_kwarg = "id" # urls.py from view import TestView urlpatterns = patterns("", url(r"^test/(?P(d)+)/$", TestView.as_view()), )
訪問:localhost:8000/test/1/
response:
{ "article": { "classification_id": 5, "read_count": 0, "sub_caption": "second", "comments": [], "content": "asdfasdfasdf", "caption": "second", "comment_count": 0, "id": 32, "publish": false }, "object": { "classification_id": 5, "read_count": 0, "sub_caption": "second", "comments": [], "content": "asdfasdfasdf", "caption": "second", "comment_count": 0, "id": 32, "publish": false }, "view": "" }
class MultipleJsonResponseMixin(JsonResponseMixin):
說明:將列表類視圖轉換為返回json數(shù)據(jù)的類視圖,適用于ListView等
用法:例子:
# view.py from dss.Mixin import MultipleJsonResponseMixin from django.views.generic import ListView from model import Article class TestView(MultipleJsonResponseMixin, ListView): model = Article query_set = Article.objects.all() paginate_by = 1 datetime_type = "string" # urls.py from view import TestView urlpatterns = patterns("", url(r"^test/$", TestView.as_view()), )
訪問:localhost:8000/test/
response:
{ "paginator": "", "article_list": [ { "classification_id": 1, "read_count": 2, "sub_caption": "first", "content": "first article", "caption": "first", "comment_count": 0, "publish": false, "id": 31 }, { "classification_id": 5, "read_count": 0, "sub_caption": "", "content": "testseteset", "caption": "hehe", "comment_count": 0, "publish": false, "id": 33 }, { "classification_id": 5, "read_count": 0, "sub_caption": "second", "content": "asdfasdfasdf", "caption": "second", "comment_count": 0, "publish": false, "id": 32 } ], "object_list": [ { "classification_id": 1, "read_count": 2, "sub_caption": "first", "content": "first article", "caption": "first", "comment_count": 0, "publish": false, "id": 31 }, { "classification_id": 5, "read_count": 0, "sub_caption": "", "content": "testseteset", "caption": "hehe", "comment_count": 0, "publish": false, "id": 33 }, { "classification_id": 5, "read_count": 0, "sub_caption": "second", "content": "asdfasdfasdf", "caption": "second", "comment_count": 0, "publish": false, "id": 32 } ], "page_obj": { "current": 1, "next": 2, "total": 3, "page_range": [ { "page": 1 }, { "page": 2 }, { "page": 3 } ], "previous": null }, "is_paginated": true, "view": "" }
class FormJsonResponseMixin(JsonResponseMixin):
說明:將普通class based view 轉換為返回json數(shù)據(jù)的class based view,適用于CreateView、UpdateView、FormView等
用法:例子:
# view.py from dss.Mixin import FormJsonResponseMixin from django.views.generic import UpdateView from model import Article class TestView(FormJsonResponseMixin, UpdateView): model = Article datetime_type = "string" pk_url_kwarg = "id" # urls.py from view import TestView urlpatterns = patterns("", url(r"^test/(?P(d)+)/$", TestView.as_view()), )
訪問:localhost:8000/test/1/
response:
{ "article": { "classification_id": 5, "read_count": 0, "sub_caption": "second", "content": "asdfasdfasdf", "caption": "second", "comment_count": 0, "id": 32, "publish": false }, "form": [ { "field": "caption" }, { "field": "sub_caption" }, { "field": "read_count" }, { "field": "comment_count" }, { "field": "classification" }, { "field": "content" }, { "field": "publish" } ], "object": { "classification_id": 5, "read_count": 0, "sub_caption": "second", "content": "asdfasdfasdf", "caption": "second", "comment_count": 0, "id": 32, "publish": false }, "view": "" }對額外數(shù)據(jù)的序列化支持:
當我們想在 model 中加入一些額外的數(shù)據(jù)并也想被序列化時, 現(xiàn)在可以這樣做:
def add_extra(article): comments = Comment.objects.filter(article=article) setattr(article, "comments", comments) articles = Article.objects.all() map(add_extra, articles) result = serializer(articles)
序列化的結果數(shù)據(jù)中將會包含"comments"哦.
額外加入的數(shù)據(jù)可以是一個普通的數(shù)據(jù)類型、 另一個 Django model、 字典、 列表甚至 QuerySet
django simple serializer 的實際例子: 個人網(wǎng)站后臺數(shù)據(jù)接口
項目地址: django-simple-serializer
歡迎大家拍磚并提供寶貴意見。
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/37997.html
摘要:大學,光學工程研究生畢業(yè),和程序猿完全不搭邊。那怎么辦,試著學一學唄,學習才是程序猿的天性。所以我在想程序猿是不是都需要新知識刺激一下,才能保持興奮的頭腦。有句話說的很對程序猿就像好奇的貓,追著毛球的線頭玩,最后一個毛球在腦袋里攪漿糊。 說說我自己的經(jīng)歷。211大學,光學工程研究生畢業(yè),和程序猿完全不搭邊。 畢業(yè)后進了成都某國字頭研究所,在行業(yè)里摸爬滾打了四年,2018年機緣巧合在家養(yǎng)...
摘要:輕量級框架是一個輕量級框架,包含多維數(shù)據(jù)分析和瀏覽聚合數(shù)據(jù)等工具。創(chuàng)造矢量地圖的輕量級框架是一個庫,用來為生成地圖。異步非阻塞的框架的全稱是,傳說中性能高高的框架。 如果你正在學習python,那么這10個開源框架,你可千萬別錯過,這些框架包括事件I/O,OLAP,Web開發(fā),高性能網(wǎng)絡通信,測試,爬蟲等。雖說不上是全都有,但也足夠滿足你了。 1.Django: Python Web應...
摘要:蠎周刊年度最贊親俺們又來回顧又一個偉大的年份兒包去年最受歡迎的文章和項目如果你錯過了幾期就這一期不會丟失最好的嗯哼還為你和你的準備了一批紀念裇從這兒獲取任何時候如果想分享好物給大家在這兒提交喜歡我們收集的任何意見建議通過來吧原文 Title: 蠎周刊 2015 年度最贊Date: 2016-01-09 Tags: Weekly,Pycoder,Zh Slug: issue-198-to...
摘要:在談中框架和框架的區(qū)別之前,我們需要先探討如下幾個問題。通過大數(shù)據(jù)統(tǒng)計分析全球著名的網(wǎng)站對和這兩個框架的調(diào)查分析。從全球著名的代碼托管平臺上的和數(shù)量上分別為,分別為。 在談Python中Django框架和Flask框架的區(qū)別之前,我們需要先探討如下幾個問題。 一、為什么要使用框架? showImg(https://segmentfault.com/img/remote/14600000...
摘要:教程特點免費中文零基礎,完整的項目,基于最新版和。如果你已有一定的開發(fā)經(jīng)驗,也能從本教程中學到更多的開發(fā)技巧。在博客教程前言追夢人物的博客的評論區(qū)留言。將問題的詳細描述通過郵件發(fā)送至,一般會在小時內(nèi)答復。 Django 是使用 Python 編寫的一個開源 Web 框架,可以用它來快速搭建一個高性能的網(wǎng)站。 Django makes it easier to build better...
閱讀 1357·2021-10-09 09:44
閱讀 1440·2021-09-28 09:36
閱讀 15927·2021-09-22 15:55
閱讀 1239·2021-09-22 15:45
閱讀 2199·2021-09-02 09:48
閱讀 2783·2019-08-29 17:19
閱讀 2296·2019-08-29 10:54
閱讀 906·2019-08-23 18:40