Подтвердить что ты не робот

Добавление атрибутов в класс Django Model Meta

Я пишу mixin, который позволит моим моделям быть легко переведены в глубокий dict значений (вроде как .values ​​(), но пересекающихся отношений). Самое чистое место, чтобы делать определения, похоже, находятся в самих моделях, a 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'
    }
}

Однако Django жалуется на то, что я включил это в class Meta с помощью:

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

(целая трассировка стека здесь)

Теперь, я полагаю, я мог бы тщательно переопределить это в моем миксе, но есть ли более элегантный способ хранения этой информации?

4b9b3361

Ответ 1

Я не знаю об элегантности, но один прагматичный способ:

import django.db.models.options as options

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

Очевидно, это сломается, если Django когда-либо добавит собственный атрибут "schema". Но эй, это мысль... вы всегда можете выбрать имя атрибута, которое с меньшей вероятностью столкнется.