django1 8讀書筆記模型高階高階

2022-07-01 15:57:08 字數 3377 閱讀 6951

一、訪問外來鍵和多對多值

例如:模型類定義如下

from

django.db import models

class

publisher(models.model):

name = models.charfield(max_length=30

) address = models.charfield(max_length=50

) city = models.charfield(max_length=60

) state_province = models.charfield(max_length=30

) country = models.charfield(max_length=50

) website =models.urlfield()

def __unicode__(self):

return

self.name

class

author(models.model):

first_name = models.charfield(max_length=30

) last_name = models.charfield(max_length=40

) email =models.emailfield()

def __unicode__(self):

return u'

%s %s

' %(self.first_name, self.last_name)

class

book(models.model):

title = models.charfield(max_length=100

) authors =models.manytomanyfield(author)

publisher =models.foreignkey(publisher)

publication_date =models.datefield()

def __unicode__(self):

return self.title

view code

在定義外來鍵或者多對多的類中訪問外來鍵比較方便。直接獲得一條資料物件,然後通過外來鍵訪問外來鍵關聯的物件。

如果想要追溯回來,也可以實現。需要使用_set.all()來獲取。使用類名的小寫形式。比如

>>> a = author.objects.get(first_name='

adrian

', last_name='

holovaty')

>>>a.book_set.all()

[, '

s other book>]

二、manager是乙個物件,django通過它進行資料庫查詢,每個django模組至少有乙個manager,可以建立自定義manager以定製資料庫訪問。為模組新增表級功能的首選方法。

需要修改的是

在模型中新增objects屬性為繼承的manager類,在類中新增新方法即可,不要新增初始函式。

三、執行原始sql

通過django.db.connection可以實現執行原始sql語句,通過connection.cursor()

得到乙個游標對像,通過cursor.execute(sql, [params])

來執行sql語句,通過cursor.fetchone()

或者cursor.fetchall()

來返回記錄集。

>>> from

django.db import connection

>>> cursor =connection.cursor()

>>> cursor.execute("""

... select distinct first_name

... from people_person

... where last_name = %s"""

, ['lennon'])

>>> row =cursor.fetchone()

>>>print row['

john

']

說明:將執行的原始sql語句放在定製的manager或者模型中比較好。

from

django.db import connection, models

class

personmanager(models.manager):

def first_names(self, last_name):

cursor =connection.cursor()

cursor.execute(

"""select distinct first_name

from people_person

where last_name = %s"""

, [last_name])

return [row[0] for row in

cursor.fetchone()]

class

person(models.model):

first_name = models.charfield(max_length=50

) last_name = models.charfield(max_length=50

) objects = personmanager()

>>> person.objects.first_names('

lennon')

['john

', '

cynthia

']

四、為有外來鍵的表插入資料

django中和sql執行的有點不太一樣,在sql中對有外來鍵的表插入資料,在外鍵欄位直接插入對應的外鍵值即可。在django中需要插入對應的資料物件。

class

userinfo(models.model):

username = models.charfield(max_length=30

); password = models.charfield(max_length=15

);class

loginfo(models.model):

user =models.foreignkey(userinfo);

timestamp = models.datetimefield(auto_now_add = true);

django中向loginfo插入資料

u1 = userinfo.objects.get(username='

lisi')

loginfo.objects.create(user=u1)

django1 8讀書筆記模版高階高階

一 概述 想要定製或者擴充套件模版引擎,模版系統工作原理,自動轉移特徵 名詞解析 模板 渲染 就是是通過從context獲取值來替換模板中變數並執行所有的模板標籤。二 context處理器 如果在模版中經常使用相同的模版變數,這是會產生大量的 冗餘,可以通過requestcontext來解決這個問題...

讀書筆記18 命令模式

1 定義 將乙個請求封裝為乙個物件,從而使你可用不同的請求對客戶進行引數化 對請求排隊或記錄請求日誌,以及支援可撤消的操作。gof 設計模式 2 角色 command 用來執行操作的介面。createcommand 將乙個接收者物件繫結乙個動作,並實現執行命令操作。invoker 要求該命令執行。r...

讀書筆記18 命令模式

1 定義 將乙個請求封裝為乙個物件,從而使你可用不同的請求對客戶進行引數化 對請求排隊或記錄請求日誌,以及支援可撤消的操作。gof 設計模式 2 角色 command 用來執行操作的介面。createcommand 將乙個接收者物件繫結乙個動作,並實現執行命令操作。invoker 要求該命令執行。r...