子类化django字段

时间:2011-09-07 21:38:56

标签: django postgresql field

当我尝试创建新的模型字段类型时,我遇到了问题 - postgres time []。

感谢psycopg2,数据库中的信息已准备好并转换为python列表。

列表看起来像是这样:

[[datetime.time(0, 0), datetime.time(23, 59, 59)], [datetime.time(0, 0), datetime.time(23, 59, 59)], [datetime.time(0, 0), datetime.time(23, 59, 59)], [datetime.time(0, 0), datetime.time(23, 59, 59)], [datetime.time(0, 0), datetime.time(23, 59, 59)], [datetime.time(0, 0), datetime.time(23, 59, 59)], [datetime.time(0, 0), datetime.time(23, 59, 59)]]

现在我可以创建使用JavaScript将其转换为时间的小部件。但在我看来,它可以在python方面更快地完成,并且因为各种时间选择器小部件处理%H中的时间:%M:%S格式,看起来明智的是以相同的格式获取和提供数据。将数据转换回字符串,即'datetime.time(0,0)'看起来也不是很好。

所以,这一切让我想问 - 在数据库读取后调用django.db.models.fields.Field类的方法是什么?从https://docs.djangoproject.com/en/dev/howto/custom-model-fields/它看起来应该是Field.to_python,但当我添加方法时:

def to_python(self, value):
    return 'xxx'

到我的领域,然后我仍然看到我之前添加的日期时间列表不是'xxx'

有人可以帮我解决这个问题:)

艾伦

1 个答案:

答案 0 :(得分:0)

在网上挖掘后,我发现了一个解决方案 - 信号。

在课堂范围之外:

def loads(value)
    #do value conversion here

在字段范围内

def contribute_to_class(self, cls, name):
    super(MyFieldName, self).contribute_to_class(cls, name)
    signals.post_init.connect(self.post_init, cls, True)

def post_init(self, **kwargs):
    instance = kwargs['instance']
    value = self.value_from_object(instance)
    if value:
        setattr(instance, self.attname, str(loads(value)))
    else:
        setattr(instance, self.attname, None)

基本上就是这样。