问题来自django。这是默认的做法,但我不明白。班级里面的元类,如何获得顶级班的名字
我有一个元类需要一个小类的原始类的名称。我怎么弄到的?
class Student(models.Model):
class Meta:
db_table = #by default this becomes "student"
问题来自django。这是默认的做法,但我不明白。班级里面的元类,如何获得顶级班的名字
我有一个元类需要一个小类的原始类的名称。我怎么弄到的?
class Student(models.Model):
class Meta:
db_table = #by default this becomes "student"
您可以使用一个装饰器来做到这一点。在课程初始化期间,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
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
我得到“type object has no attribute Meta” – Kiarash
@Kiarash请尝试更新的版本。 –