2014-07-26 69 views

回答

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 
+0

我得到“type object has no attribute Meta” – Kiarash

+0

@Kiarash请尝试更新的版本。 –

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 
+0

问题是,我仍然需要继承Django的models.Model因为其他属性。当我添加你的解决方案时,我得到这个错误:“元类冲突:派生类的元类必须是所有基类元类的(非严格)子类” – Kiarash

+0

@Kiarash:那是一个完全不同的问题。你将不得不继承Django的'models.Model'元类,重写'__new__'来完成这个工作,并创建一个新的'Model',它的元类是你的新元类。 – Blender