0

我有一个模型,我想使用类方法来设置属性的默认值:

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()?

4

3 回答 3

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
于 2012-08-14T05:47:36.080 回答
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
于 2012-08-14T05:26:25.013 回答
-1

您需要指定类名:Organisation.generate_code()

于 2012-08-14T05:09:19.040 回答