定義一個metaclass(和一個基類),提供所有的子類給出的一個領域類型,與可以在子類中設置的,但不必是默認值:
from django.db import models
class DefaultTextFieldMetaclass(models.base.ModelBase):
DEFAULT_TEXT = 'this is the metaclass default'
def __new__(mcs, name, parents, _dict):
if not (('Meta' in _dict) and hasattr(_dict['Meta'], 'abstract') and _dict['Meta'].abstract):
# class is concrete
if 'DEFAULT_TEXT' in _dict:
default = _dict['DEFAULT_TEXT']
else: # Use inherited DEFAULT_TEXT if available
default_set = False
for cls in parents:
if hasattr(cls, 'DEFAULT_TEXT'):
default = cls.DEFAULT_TEXT
default_set = True
if not default_set:
default = mcs.DEFAULT_TEXT
_dict['modeltext'] = models.TextField(default=default)
return super(DefaultTextFieldMetaclass, mcs).__new__(mcs, name, parents, _dict)
class BaseTextFieldClass(models.Model):
class Meta(object):
abstract = True
__metaclass__ = DefaultTextFieldMetaclass
DEFAULT_TEXT = 'superclass default'
class TextA(BaseTextFieldClass):
DEFAULT_TEXT = 'A default for TextA'
class TextB(BaseTextFieldClass):
DEFAULT_TEXT = 'The default for TextB'
number = models.IntegerField(default=43)
class TextC(BaseTextFieldClass):
othertext = models.TextField(default='some other field')
除非你有一大堆的子類和/或扎入BaseTextFieldClass多種方法/屬性和假設,這可能是矯枉過正的......但它應該做OP所要求的。
如果我簡單地定義爲在基類中的所有元素的默認值,可能我們再只覆蓋了保存方法所有的子類,還是將在基類中定義的默認值導致實例變量永遠不會爲空? (也就是說,如果我在父類中定義了默認值,那麼在保存或初始化對象時是否添加了默認值?) – Zxaos
同樣,您必須將Django中的繼承看作超類的FK,所以如果超類具有缺省值的字段,則子類中的字段也將具有缺省值的字段,因爲該字段實際上不是來自子類,而是來自超類。 – juliomalegria