类里面的元类,如何获得顶级类的名称

时间:2014-07-26 09:09:44

标签: python django

问题来自django。这是默认情况下的事情,但我不明白如何做。

我有一个Meta Class需要一个原始类名称的小写。我怎么能得到它?

class Student(models.Model):

    class Meta:
        db_table =  #by default this becomes "student"

2 个答案:

答案 0 :(得分:1)

您可以使用装饰器。在类初始化期间Student不存在,因此您只能在类定义之后设置它。

def lower_db_name(cls):
    cls._meta.db_table = cls.__name__.lower()
    return cls

@lower_db_name
class Student(models.Model):
    class Meta:
        pass

答案 1 :(得分:1)

Django使用元类来完成它。你可以做类似的事情:

class ModelMeta(type):
    def __new__(cls, cls_name, bases, attrs):
        if 'Meta' in attrs and not hasattr(attrs['Meta'], 'db_table'):
            attrs['Meta'].db_table = cls_name.lower()

        return super(ModelMeta, cls).__new__(cls, cls_name, bases, attrs)

class Model:
    __metaclass__ = ModelMeta

class Student(Model):
    class Meta:
        thing = 12