我有一个模型,我想使用类方法来设置属性的默认值:
class Organisation(db.Model):
name=db.StringProperty()
code=db.StringProperty(default=generate_code())
@classmethod
def generate_code(cls):
import random
codeChars='ABCDEF0123456789'
while True: # Make sure code is unique
code=random.choice(codeChars)+random.choice(codeChars)+\
random.choice(codeChars)+random.choice(codeChars)
if not cls.all().filter('code = ',code).get(keys_only=True):
return code
但是我得到一个NameError:
NameError: name 'generate_code' is not defined
如何访问generate_code()?
答案 0 :(得分:4)
正如我在评论中所说,我会使用一种类方法作为工厂,并始终通过那里创建实体。它使事情更简单,没有讨厌的钩子来获得你想要的行为。
这是一个简单的例子。
class Organisation(db.Model):
name=db.StringProperty()
code=db.StringProperty()
@classmethod
def generate_code(cls):
import random
codeChars='ABCDEF0123456789'
while True: # Make sure code is unique
code=random.choice(codeChars)+random.choice(codeChars)+\
random.choice(codeChars)+random.choice(codeChars)
if not cls.all().filter('code = ',code).get(keys_only=True):
return code
@classmethod
def make_organisation(cls,*args,**kwargs):
new_org = cls(*args,**kwargs)
new_org.code = cls.generate_code()
return new_org
答案 1 :(得分:0)
import random
class Test(object):
def __new__(cls):
cls.my_attr = cls.get_code()
return super(Test, cls).__new__(cls)
@classmethod
def get_code(cls):
return random.randrange(10)
t = Test()
print t.my_attr
答案 2 :(得分:-1)
您需要指定班级名称:Organisation.generate_code()