2014-07-26 108 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