Код запуска django перед доступом к полю модели? (поля прокси-модели)

Я пытаюсь проксировать доступ к некоторым полям моделей. Простой пример использования, которое я хочу.

@uppercase_fields(['name'])
class Book(models.Model):
   name = models.CharField(max_length=50)
   # .. more fields ..

Для экземпляра книги с именем = 'some_book':
Доступ к book.name должен вернуть 'SOME_BOOK'

Я знаю, что это выглядит странно, но мне нужна такая оболочка доступа к полям модели, которая будет действовать так, как если бы я обычно обращался к полям модели. Так что метод здесь не вариант.

Я думал об использовании __getattr__, но читал, что это может испортить внутреннюю структуру django. Есть способ лучше, желательно простой?

У вас должно быть все в порядке с переопределением __getattribute__, если вы вызываете super и управляете только значениями определенного поля. Я не думаю, что есть другой выход.

xyres 27.05.2018 01:03

Вам нужно хранить их в нижнем регистре? Возможно, другое решение вашей проблемы - сделать поля выше перед их сохранением, так вам не нужно будет делать ничего особенного при доступе к полям.

Sardorbek Imomaliev 27.05.2018 05:42
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
82
1

Ответы 1

Я думаю, вам придется использовать __getattribute__ (не __getattr__, потому что он вызывается только в том случае, если атрибут не может быть найден другими способами). Ваша реализация должна вызвать super().__getattribute__ для доступа к значению, а затем либо изменить его, если оно есть в вашем списке декораторов, либо вернуть его как есть.

Я только что посмотрел на этот пакет: github.com/django-parler/django-parler, который также исправляет поля модели. Я посмотрел на код и не понял, как это делается. Метод __getattribute__ не нашел.

user3599803 27.05.2018 08:40

Как указано в документации, «внутри django-parler хранит переведенные поля в отдельной модели, по одной строке для каждого языка». Таким образом, доступ к полям - это просто свойство или аннотация в этом пакете, который берет данные из другой таблицы. Но я не думаю, что вы хотите хранить name в отдельной таблице

Alexandr Tatarinov 28.05.2018 09:39

Другие вопросы по теме