国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Python > 正文

利用Python的Django框架中的ORM建立查詢API

2020-02-23 00:49:25
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

 摘要

在這篇文章里,我將以反模式的角度來(lái)直接討論Django的低級(jí)ORM查詢方法的使用。作為一種替代方式,我們需要在包含業(yè)務(wù)邏輯的模型層建立與特定領(lǐng)域相關(guān)的查詢API,這些在Django中做起來(lái)不是非常容易,但通過深入地了解ORM的內(nèi)容原理,我將告訴你一些簡(jiǎn)捷的方式來(lái)達(dá)到這個(gè)目的。

概覽

當(dāng)編寫Django應(yīng)用程序時(shí),我們已經(jīng)習(xí)慣通過添加方法到模型里以此達(dá)到封裝業(yè)務(wù)邏輯并隱藏實(shí)現(xiàn)細(xì)節(jié)。這種方法看起來(lái)是非常的自然,而且實(shí)際上它也用在Django的內(nèi)建應(yīng)用中。
 

>>> from django.contrib.auth.models import User>>> user = User.objects.get(pk=5)>>> user.set_password('super-sekrit')>>> user.save()

這里的set_password就是一個(gè)定義在django.contrib.auth.models.User模型中的方法,它隱藏了對(duì)密碼進(jìn)行哈希操作的具體實(shí)現(xiàn)。相應(yīng)的代碼看起來(lái)應(yīng)該是這樣:
 

from django.contrib.auth.hashers import make_password class User(models.Model):   # fields go here..   def set_password(self, raw_password):    self.password = make_password(raw_password)


我們正在使用Django,建立一個(gè)特定領(lǐng)域的頂部通用接口,低等級(jí)的ORM工具。在此基礎(chǔ)上,增加抽象等級(jí),減少交互代碼。這樣做的好處是使代碼更具可讀性、重用性和健壯性。

我們已經(jīng)在單獨(dú)的例子中這樣做了,下面將會(huì)把它用在獲取數(shù)據(jù)庫(kù)信息的例子中。

為了描述這個(gè)方法,我們使用了一個(gè)簡(jiǎn)單的app(todo list)來(lái)說明。

注意:這是一個(gè)例子。因?yàn)楹茈y用少量的代碼展示一個(gè)真實(shí)的例子。不要過多的關(guān)心todo list繼承他自己,而要把重點(diǎn)放在如何讓這個(gè)方法運(yùn)行。
下面就是models.py文件:
 

from django.db import models PRIORITY_CHOICES = [(1, 'High'), (2, 'Low')] class Todo(models.Model):  content = models.CharField(max_length=100)  is_done = models.BooleanField(default=False)  owner = models.ForeignKey('auth.User')  priority = models.IntegerField(choices=PRIORITY_CHOICES, default=1


想像一下,我們將要傳遞這些數(shù)據(jù),建立一個(gè)view,來(lái)為當(dāng)前用戶展示不完整的,高優(yōu)先級(jí)的 Todos。這里是代碼: 
 

def dashboard(request):   todos = Todo.objects.filter(    owner=request.user  ).filter(    is_done=False  ).filter(    priority=1  )   return render(request, 'todos/list.html', {    'todos': todos,  })

注意:這里可以寫成request.user.todo_set.filter(is_done=False, priority=1)。但是這里只是一個(gè)實(shí)驗(yàn)。

為什么這樣寫不好呢?

首先,代碼冗長(zhǎng)。七行代碼才能完成,正式的項(xiàng)目中,將會(huì)更加復(fù)雜。

其次,泄露實(shí)現(xiàn)細(xì)節(jié)。比如代碼中的is_done是BooleanField,如果改變了他的類型,代碼就不能用了。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 宾阳县| 赫章县| 泉州市| 金昌市| 新密市| 新晃| 佛山市| 安西县| 泰兴市| 台江县| 绥江县| 黑龙江省| 射洪县| 内江市| 霍邱县| 河曲县| 永宁县| 双桥区| 金溪县| 大连市| 九龙县| 庆元县| 清水县| 荥阳市| 宁南县| 汉源县| 基隆市| 正蓝旗| 柘荣县| 莒南县| 廉江市| 临洮县| 攀枝花市| 宜章县| 瑞昌市| 康乐县| 林西县| 南乐县| 乐陵市| 肇庆市| 仲巴县|