添加属性到的Django模型的元类(Adding attributes into Django Mo

2019-07-29 18:05发布

我正在写一个混合,这将使我的模型可以很容易地转化为价值的深刻字典(如.values()种,但遍历关系)。 做这些定义中的干净的地方似乎是在模型本身,一拉:

class Person(models.Model, DeepValues):
    name = models.CharField(blank=True, max_length=100)
    tribe = models.ForeignKey('Tribes')

    class Meta:
        schema = {
            'name' : str,
            'tribe' : {
                'name' : str
            }
        }

Person.objects.all().deep_values() => {
    'name' : 'Andrey Fedorov',
    'tribe' : {
        'name' : 'Mohicans'
    }
}

然而,Django的抱怨我这包括在class Meta有:

TypeError: 'class Meta' got invalid attribute(s): schema

(整个堆栈跟踪这里 )

现在,我想我可以在精心我的mixin覆盖此,但有存储该信息的更优雅的方式?

Answer 1:

我不知道优雅,但一个务实的方法是:

import django.db.models.options as options

options.DEFAULT_NAMES = options.DEFAULT_NAMES + ('schema',)

显然,如果Django中添加过它自己的“模式”属性,这将打破。 但是,嘿,这是一个想法...你总是可以选择一个属性名称是不太可能发生冲突。



文章来源: Adding attributes into Django Model's Meta class