【问题标题】:django run code before model field access? (proxy model fields)django 在模型字段访问之前运行代码? (代理模型字段)
【发布时间】:2018-05-26 18:54:23
【问题描述】:

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

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

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

我知道这看起来很奇怪,但我需要一个像这样围绕模型字段的访问包装器,它的作用就像我可以正常访问模型字段一样。所以方法在这里不是一个选项。

我曾想过使用__getattr__,但我读到它可能会与 django 内部结构混淆。有没有更好的方法,最好是简单的?

【问题讨论】:

  • 只要您调用 super 并且只操作特定字段的值,您应该可以覆盖 __getattribute__。我认为没有其他方法。
  • 需要小写存储吗?也许您的问题的另一种解决方案是在保存之前将字段设置为高位,这样您就不需要在访问字段时做任何特殊的事情

标签: python django django-models field


【解决方案1】:

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

【讨论】:

  • 我刚刚看过这个包:github.com/django-parler/django-parler,它还修补了模型字段。我查看了代码,但不知道它是如何完成的。我没有找到__getattribute__ 方法。
  • 如文档所述,“在内部,django-parler 将翻译后的字段存储在单独的模型中,每种语言一行。”。所以字段访问只是这个包中的属性或注释,它从另一个表中获取数据。但我认为您不想将name 存储在单独的表中
猜你喜欢
  • 1970-01-01
  • 2016-01-03
  • 2020-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-30
  • 2011-11-28
  • 2013-03-16
相关资源
最近更新 更多