Я пытаюсь проксировать доступ к некоторым полям моделей. Простой пример использования, которое я хочу.
@uppercase_fields(['name'])
class Book(models.Model):
name = models.CharField(max_length=50)
# .. more fields ..
Для экземпляра книги с именем = 'some_book':
Доступ к book.name должен вернуть 'SOME_BOOK'
Я знаю, что это выглядит странно, но мне нужна такая оболочка доступа к полям модели, которая будет действовать так, как если бы я обычно обращался к полям модели. Так что метод здесь не вариант.
Я думал об использовании __getattr__, но читал, что это может испортить внутреннюю структуру django. Есть способ лучше, желательно простой?
Вам нужно хранить их в нижнем регистре? Возможно, другое решение вашей проблемы - сделать поля выше перед их сохранением, так вам не нужно будет делать ничего особенного при доступе к полям.






Я думаю, вам придется использовать __getattribute__ (не __getattr__, потому что он вызывается только в том случае, если атрибут не может быть найден другими способами).
Ваша реализация должна вызвать super().__getattribute__ для доступа к значению, а затем либо изменить его, если оно есть в вашем списке декораторов, либо вернуть его как есть.
Я только что посмотрел на этот пакет: github.com/django-parler/django-parler, который также исправляет поля модели. Я посмотрел на код и не понял, как это делается. Метод __getattribute__ не нашел.
Как указано в документации, «внутри django-parler хранит переведенные поля в отдельной модели, по одной строке для каждого языка». Таким образом, доступ к полям - это просто свойство или аннотация в этом пакете, который берет данные из другой таблицы. Но я не думаю, что вы хотите хранить name в отдельной таблице
У вас должно быть все в порядке с переопределением
__getattribute__, если вы вызываетеsuperи управляете только значениями определенного поля. Я не думаю, что есть другой выход.