django在模型字段访问之前运行代码? (代理模型字段)

时间:2018-05-26 18:54:23

标签: python django django-models field

我正在尝试代理某些模型字段的访问权限。我想要的一个简单示例。

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

给定一个名为='some_book'的书籍实例:
访问book.name应该返回'SOME_BOOK'

我知道它看起来很奇怪,但我需要一个类似于模型字段的访问包装器,就像我正常访问模型字段一样。所以这里的方法不是一个选择。

我想过使用__getattr__,但我读过它可能会弄乱django内部。有没有更好的方法,最好是简单的?

1 个答案:

答案 0 :(得分:1)

我认为您必须使用__getattribute__(而不是__getattr__,因为只有在其他方式无法找到属性时才会调用它。 您的实现应该调用super().__getattribute__来访问该值,然后修改它,如果它在装饰器列表中或按原样返回。