在django自定义字段中,SubfieldBase元类的功能是什么?

时间:2015-08-03 17:28:10

标签: django django-models

当您实现自定义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的?那会怎样称呼?

1 个答案:

答案 0 :(得分:1)

对于Django版本< = 1.7 ,Django提供了一个名为SubfieldBase的元类。

SubFieldBase的主要功能是分配时调用to_python()因此,当您添加__metaclass__时,它会自动调用{{ 1}}函数将值转换为正确的Python对象。它处理从数据库加载时需要进行类型转换但未在to_python()调用或聚合中使用的字段。

虽然在Django 1.8中已经发生了变化。它已被from_db_value().

取代

根据Django 1.8 docs

  

历史上,Django提供了一个名为.values()的元类   总是在分配时调用SubfieldBase。这并没有很好地发挥作用   自定义数据库转换,聚合或值查询,所以它   已替换为to_python()