2015-09-01 61 views
0

models.py如何訪問的Django模型

from django.db import models 

from alpha_id import get_alpha_id 


class Sample(models.Model): 
    alpha_id = get_alpha_id(self.id) 
    sample_name = models.CharField(max_length=30) 
    entry_date = models.DateField(auto_now_add=True) 


    def __unicode__(self): 
     return self.alpha_id 

alpha_id.py

import string 

ALL_LETTERS = string.ascii_uppercase.replace('F', '').replace('I', '').replace('L', '').replace('O', '').replace('V', '') 

def get_alpha_id(id): 
    """ Return the alpha numeric ID according to the current 
     integer id. 
    """ 
    global ALL_LETTERS 
    alpha = ALL_LETTERS[(id%len(ALL_LETTERS))-1] 
    return str(id) + '_' + alpha 

這裏的實例化的屬性,我想創建它建立基於一個字母數字ID的alpha_id模型屬性自動創建的整數id屬性。我寫了一個執行算法的函數,我只需要將該方法發送給當前實例化模型的id。例如:

>>> get_alpha_id(1) 
1_A 
>>>get_alpha_id(2) 
2_B 

無論如何,我有這個邏輯都想通了。我所需要做的就是弄清楚如何傳遞給我的Sample模型的當前實例的id屬性。

顯然我的問題在於,我沒有提到類Sample的實例化,所以使用「self.id」會導致錯誤。具體而言:

alpha_id = get_alpha_id(self.id) 
NameError: name 'self' is not defined 

我有一種感覺,解決方案涉及的東西做定義__init__method但我不能肯定我怎麼會去這樣做。我看過Model.py基類,我無法完全找到id屬性的定義。總結一下,如何訪問實例化的Django模型的當前id,以便我可以使用該整數值來通知創建另一個屬性?

回答

3

而不是使alpha_id類屬性的,你需要使它實例屬性使用的實例方法的@property裝飾:

class Sample(models.Model): 
    sample_name = models.CharField(max_length=30) 
    entry_date = models.DateField(auto_now_add=True) 

    @property 
    def alpha_id(self): 
     return get_alpha_id(self.id) 

    def __unicode__(self): 
     return self.alpha_id 
+0

那完美。我將不得不閱讀這裏究竟發生了什麼。謝謝。 – Malonge

+0

@Malonge對於ref:[@property docs](https://docs.python.org/2/library/functions.html#property),你也可以在'alpha_id'方法的屬性中緩存id,這樣你不要每次都運行函數:'if not hasattr(self,'_alpha_id'):self._alpha_id = get_alpha_id(self.id);返回self._alpha_id' –