将属性添加到Django Model的Meta类中

And*_*rov 36 python django metadata django-models

我正在编写一个mixin,它可以让我的模型很容易地被翻译成一个深刻的价值观(有点像.values(),但是遍历关系).对这些进行定义的最干净的地方似乎是模型本身,la:

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'
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,Django抱怨我把这包括在内class Meta:

TypeError: 'class Meta' got invalid attribute(s): schema
Run Code Online (Sandbox Code Playgroud)

(整个堆栈跟踪在这里)

现在,我想我可以在我的mixin中巧妙地覆盖它,但是有更优雅的方式来存储这些信息吗?

Vin*_*jip 52

我不知道优雅,但一种务实的方式是:

import django.db.models.options as options

options.DEFAULT_NAMES = options.DEFAULT_NAMES + ('schema',)
Run Code Online (Sandbox Code Playgroud)

显然,如果Django添加了自己的"schema"属性,这将会破坏.但是,嘿,这是一个想法......你总是可以选择一个不太可能发生冲突的属性名称.

  • 为了后人的缘故,这不起作用,但这样做:options.DEFAULT_NAMES = options.DEFAULT_NAMES +('default_values',) (5认同)
  • 哦......这可能是因为我的解决方案将DEFAULT_NAMES转换为列表,而您的改进将其保留为元组. (2认同)