Django1.7学习(二)
7.玩轉API
接下來,我們進入 Python 的交互式 shell 中玩轉 Django 提供的 API 。使用以下命令調用Python shell:
python manage.py shell我們當前使用的環境不同于簡單的輸入 “python” 進入的 shell 環境,?manage.py?文件設置了?DJANGO_SETTINGS_MODULE環境變量,該變量給定了 Django 需要導入的 mysite/settings.py?文件所在路徑。
注:如果確實不想使用 manage.py 也可以,只需要設置環境變量DJANGO_SETTINGS_MODULE的值為mysite.settings,啟用Python shell 并輸入以下命令即可:
import django django.setup()此處需注意應在與?manage.py?文件所在同一目錄下運行?python?( 或確保目錄在 Python path 下)
進入shell中后,就可以開始探索 database API了
>>> from polls.models import Question, Choice # 導入剛創建的模塊類>>> Question.objects.all() []# 創建一個新的Question # 默認配置文件中時區支持是啟用的,因此 Django 希望為 pub_date 獲取一個帶 tzinfo 的 datetime # 此處使用 timezone.now() 來替代 datetime.datetime.now() 以獲取正確的值 >>> from django.utils import timezone >>> q = Question(question_text="What's new?",pub_date=timezone.now())# 將對象保存到數據庫中,此處應調用save() 方法 >>> q.save()# 現在對象有了一個 ID. 此處注意有可能會顯示 "1L" 而不是 "1", 這取決于你正使用的數據庫 # 這無關緊要,僅僅表明你的數據庫后端更偏向于返回 integers 作為 Python 的 long integer 對象 >>> q.id 1# 通過 Python 屬性訪問字段值 >>> q.question_text "What's new?" >>> q.pub_date datetime.datetime(2014, 9, 13, 6, 31, 27, 704000, tzinfo=<UTC>)# 通過改變屬性來改變值, 然后調用 save(). >>> q.question_text = "What's up?" >>> q.save()# objects.all() 用以打印出所有在數據庫中的 question. >>> Question.objects.all() [<Question: Question object>]
注意:<Question:?Question?object> 這樣的對象顯示方式是毫無意義的。
為了轉換成我們看得懂的顯示方式,此處可以通過修改?Question?這個model (polls/models.py 文件中)并為?Question?和?Choice 都添加上一個__str__()方法:
為 models 添加__str__()方法是很重要的,不只能讓自己在處理交互式提示時更加清晰,同時在 Django 自動生成的后臺管理界面中也會用到
__str__ 還是 __unicode__?
如果使用的是Python 3.x 版本,很簡單,直接使用 __str__()
如果使用的是Python 2.x 版本,則需要定義 __unicode__()方法來返回unicode值。Django 的 models 有一個默認的__str__()方法會調用__unicode__()方法將結果轉換成UTF-8編碼的字符串,這就意味著 unicode(p)將返回一個Unicode編碼的字符串,而str(p)將返回一個UTF-8編碼字符串。Python則相反:object 擁有一個__unicode__ 方法調用__str__將結果轉變為 ASCII 字符串,這極容易造成混淆。
如果上面的這些讓你感覺到混亂,那么推薦使用Python 3.x版本。
?接下來嘗試著自定義一個方法
import datetimefrom django.db import models from django.utils import timezoneclass Question(models.Model):# ...def was_published_recently(self):return self.pub_date >= timezone.now() - datetime.timedelta(days=1)增加了?import?datetime?和?from?django.utils?import?timezone, 分別是為了引用 Python 的標準庫的?datetime?模塊和 Django 的?django.utils.timezone?中的 time-zone-related 實用工具 。
保存以上更改并且再次運行?python?manage.py?shell?以開啟一個新的 Python shell
>>>?from?polls.models?import?Question, Choice# 確認下添加的 __str__() 正常運行. >>> Question.objects.all() [<Question: What's up?>]# Django 提供了一個豐富的完全由關鍵字驅動的數據庫查詢 API >>> Question.objects.filter(id=1) [<Question: What's up?>] >>> Question.objects.filter(question_text__startswith='What') [<Question: What's up?>]# 獲取在今年內發布的 Question >>> from django.utils import timezone >>> current_year = timezone.now().year >>> Question.objects.get(pub_date__year=current_year) <Question: What's up?># 請求一個不存在的 ID ,然后將引發異常. >>> Question.objects.get(id=2) Traceback (most recent call last):... DoesNotExist: Question matching query does not exist.# 根據主鍵查詢是一種比較常見的方式, 因此 Django 提供了一個精確查找主鍵的快捷方式 # 以下內容等同于 Question.objects.get(id=1). >>> Question.objects.get(pk=1) <Question: What's up?># 確認下我們自定義的方法正常運行. >>> q = Question.objects.get(pk=1) >>> q.was_published_recently() True# 給 Question 設置一些 Choice. 創建一個新的 Choice 對象,執行 INSERT 語句后,
# 添加 choice 到可用的 choices 集合然后返回一個新的 Choice 對象.
# Django 創建了一個可以通過 API 訪問的保存外鍵關聯的集合(如 question 的 choice) >>> q = Question.objects.get(pk=1)# 從關聯對象集合中顯示所有 choice -- 當前為空. >>> q.choice_set.all() []# 創建三個 choice. >>> q.choice_set.create(choice_text='Not much', votes=0) <Choice: Not much> >>> q.choice_set.create(choice_text='The sky', votes=0) <Choice: The sky> >>> c = q.choice_set.create(choice_text='Just hacking again', votes=0)# Choice 對象擁有訪問與它們關聯的 Question 對象的 API >>> c.question <Question: What's up?># 反之亦然: Question 對象也可以訪問 Choice 對象. >>> q.choice_set.all() [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>] >>> q.choice_set.count() 3# 只要需要 API 會自動連續關聯,可以使用雙下劃線來隔離關聯
# 需要多少層的關聯就可以有多少層的關聯,沒有任何限制 # 找出所有 pub_date 在今年的與 question 有關聯的 Choice # (重復使用我們之前創建的的變量 'current_year') >>> Choice.objects.filter(question__pub_date__year=current_year) [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]# 用 delete() 來刪除 choices 的其中一個. >>> c = q.choice_set.filter(choice_text__startswith='Just hacking') >>> c.delete()
?參考:https://docs.djangoproject.com/en/1.7/intro/tutorial01/
未完待續。。。
轉載于:https://www.cnblogs.com/Mr-Rice/p/3970880.html
總結
以上是生活随笔為你收集整理的Django1.7学习(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 回首经典的SQL Server 2005
- 下一篇: JAVA js的escape函数、解析用