一:self是什麼
目前新版的odoo中使用到的self,是對 游標cr、使用者id、模型、上下文、記錄集、快取 的封裝。
我們可以通過 self.xx 獲取到這些封裝的東西,比如:self.cr、self.uid。
二:通過直接設定屬性來改變資料庫中字段值
我們在查出某模型的記錄後,可以通過 record.xx = value 來直接修改記錄的字段內容。
同樣,在重寫模型的write方法中,也可以通過 self.xx = value 來指定新增記錄中某字段的值。
這裡需要注意兩點:
1:修改查出來的記錄欄位值來改變資料庫內容,是通過改變快取中的值出發資料庫寫記錄來達到的。
2:重寫write方法時,在write方法中每呼叫一次 self.xx = value 語句,都會觸發資料庫寫操作,因此一般採用:
for rec in self:rec.xx = xx
的寫法。
三:環境
1:操作快取
環境儲存了模型的快取記錄集,因此我們可以通過環境來獲取、增加、修改、刪除記錄,而觸發資料庫更改,從而達到運算元據庫的目的。
例如:新增一條記錄
self.env['模型'].create(vals)
2:改變使用者許可權
我們可以通過self.sudo()獲得超級許可權,從而確保我們的操作能夠進行。
self.env[『model'].sudo().create(vals)
3:訪問當前使用者
self.env.user
4:獲取xml的id
self.env.ref('external id')
5:更新快取,觸發資料庫操作
self.env.invalidate_all()
四:self常用介面
1:普通查詢:返回記錄集,後續通過修改記錄值來觸發資料庫修改
self.search(domain) //從當前模型的self中查詢self.env['model'].search(domain) // 獲取某個model的環境,查詢其中的記錄集
2:唯讀查詢:返回列表,只能提取內容,不能觸發資料庫修改
self.search_read(,['要查詢的字段'])
3:統計數量:返回符合條件的記錄條數
self.search_count(domain)
4:瀏覽:通過一系列id值,返回對應的記錄集
self.browse([id])
5:刪除
self.unlink(domain)
五:new ids
odoo在建立乙個新記錄時,會使用models.ids虛擬乙個記錄id。
可以通過
if is instance(record.id,models.newid):
來判斷。
六、資料庫查詢
import psycopg2
class ***xx(models.model):
........
@api.multi
def oooo(self):
db = psycopg2.connect("dbname=test4 user=postgres")#查詢名叫 test4 的資料庫 postgres 是資料庫的超級使用者名稱
vals = db.cursor()
vals.execute("select sales,prices,sale_date from run_chart")#執行sql語句查詢資料
tables = vals.fetchall()#返回查詢結果
#或者sql = "select *from 表名"
self.env.cr.execute(sql) #執行sql語句
dicts = self.env.cr.dictfetchall() #獲取sql的查詢結果
OC中self和super的使用
1 self用在物件方法中,self指代的是呼叫當前方法的那個物件,可以呼叫其它物件方法。2 self用在類方法中,self指代的是當前類,可以呼叫其它類方法,不可以呼叫物件方法。3 self修飾例項變數 一般在set方法中使用 用在形參變數和例項變數同名時。例 void setspeed int ...
odoo 關於self的迭代器(1)迭代器初步
起因 在學習odoo對他們的self迴圈很不適應,所以決定留些東西在這裡。開篇 計算機最擅長做批量工作,所以任何語言都繞不開迴圈。迴圈我習慣這麼分類 當真是個人的習慣,非常廣義,不要較真 1.以個數為限制的 工作中這種情況並不是太多 n 1 while n 100 print n n n 1for ...
PHP中static 跟self的使用區別
php中static 和self的使用區別。首先來看一下self的情況 class a public static function test class b extends a a test a b test a 先來是看一下static的情況 class a public static func...