当您实现自定义Django字段时,您应该包含以下行:
__metaclass__ = models.SubfieldBase
在类定义中,如:
class SomeCustomField(models.Field):
__metaclass__ = models.SubfieldBase
这实际上是做什么的?
更新
这是元类的源代码(来自Django项目):
class SubfieldBase(type):
"""
A metaclass for custom Field subclasses. This ensures the model's attribute
has the descriptor protocol attached to it.
"""
def __new__(cls, name, bases, attrs):
new_class = super(SubfieldBase, cls).__new__(cls, name, bases, attrs)
new_class.contribute_to_class = make_contrib(
new_class, attrs.get('contribute_to_class')
)
return new_class
这是如何导致调用to_python的?那会怎样称呼?
答案 0 :(得分:1)
对于Django版本< = 1.7 ,Django提供了一个名为SubfieldBase
的元类。
SubFieldBase
的主要功能是分配时调用to_python()
。因此,当您添加__metaclass__
时,它会自动调用{{ 1}}函数将值转换为正确的Python对象。它处理从数据库加载时需要进行类型转换但未在to_python()
调用或聚合中使用的字段。
虽然在Django 1.8中已经发生了变化。它已被from_db_value().
历史上,Django提供了一个名为
.values()
的元类 总是在分配时调用SubfieldBase
。这并没有很好地发挥作用 自定义数据库转换,聚合或值查询,所以它 已替换为to_python()
。