当前位置:  开发笔记 > 编程语言 > 正文

Django - 具有伴随存储字段的自定义虚拟模型字段

如何解决《Django-具有伴随存储字段的自定义虚拟模型字段》经验,为你挑选了1个好方法。

我想要一个ConfirmationField字段类型.我希望这个字段像布尔字段一样工作.我不需要将此信息存储在数据库中,而是希望将确认日期存储在单独的字段中.

class MyModel(models.Model):
    confirmation = ConfirmationField()


m = MyModel()
m.confirmation # False
m.confirmation_timestamp # None

m.confirmation = True
m.save()

m.confirmation_timestamp # datetime object


m.confirmation = False
m.save()

m.confirmation_timestamp # None again

我需要将两个字段都作为Field实例,我需要能够在Admin中使用它们.

我已阅读文档并检查代码,ForeignKey使用以下代码更改其数据库列名称:

def get_attname(self):
    return '%s_id' % self.name

但我无法弄清楚如何使用其余代码作为示例.看来我的目标并不需要太多的复杂性.

ImageField保存模型时,我还发现了保存的额外信息:

    if self.field.width_field:
        setattr(self.instance, self.field.width_field, self.width)
    if self.field.height_field:
        setattr(self.instance, self.field.height_field, self.height)

但是我当然不希望confirmation自己存储在数据库中.因为(confirmation_timestamp- > confirmation)None== False==,我会造成冗余True.

任何指针/想法都表示赞赏.

谢谢.

编辑:目前看来这是不可能的.我最终改变了我的API.这是一个snipplet,让我知道我是如何做到的:

    value = {'BooleanField': True,
             'DateTimeField': datetime.datetime.now(),
             'DateField': datetime.date.today(),
             'IntegerField': 1,
            }[instance._meta.get_field(field_name).get_internal_type()]
    setattr(instance, field_name, value)

您可以拥有上述任何类型的确认字段,并设置正确的值.并且可以使用确认检查bool(getattr(instance, field_name).



1> ohnoes..:

如果我做对了,请考虑:

class Modelname(models.Model):
    """(Modelname description)"""

    confirmation_timestamp = models.DateTimeField(blank=True)

    def _set_confirmation(self, value):
        if not value:
            self.confirmation_timestamp = None
        else:
            self.confirmation_timestamp = datetime.datetime.now()

    def _get_confirmation(self):
        return bool(self.confirmation_timestamp)

    confirmation = property(_get_confirmation, _set_confirmation)
    confirmation.short_description = "Confirmation"
    confirmation.boolean = True # have it nicely displayed in admin

推荐阅读
牛尾巴2010
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有