2015-08-03 1 views
1

При реализации пользовательского поля Django, вы должны включить эту строку:В настраиваемом поле django, что делает метаклассы SubfieldBase?

__metaclass__ = models.SubfieldBase 

в определении класса, как в:

class SomeCustomField(models.Field): 
    __metaclass__ = models.SubfieldBase 

Что это на самом деле?

Update:

Это исходный код для метакласса (от проекта 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

Для версий Django < = 1.7, Django предоставляет метакласс под названием SubfieldBase.

Главной особенностью SubFieldBase является то, что это вызывает to_python() при назначении. Итак, когда вы добавили __metaclass__, он автоматически вызовет функцию to_python(), чтобы преобразовать значение в правильный объект Python. Он обрабатывает те поля, где требуется преобразование типов при загрузке из базы данных, но не используется в .values() вызовах или в совокупности.

Это был изменен в Django 1.8. Он был заменен from_db_value().

Согласно Django 1.8 docs:

Исторически Джанго при условии метаклассом называется SubfieldBase, который всегда под названием to_python() на уступки. Это не играло хорошо с пользовательских преобразований базы данных, агрегации или запросов значений, поэтому он был заменен на from_db_value().

+1

Хорошо, так что ответ определенно просто: прекратите использовать django 1.7 и переключитесь на 1.8! :) thanks – Brendan

+1

Примечание. Если ваш пользовательский класс Field имеет дело с структурами данных, которые являются более сложными, чем строки, даты, целые числа или float, вам может потребоваться переопределить 'from_db_value()' и 'to_python()'. –

+1

Если, однако, вы хотите проверить назначение, то в Django 1.8 вам нужно будет реализовать его самостоятельно. – Suor

Смежные вопросы