将Django对象的Null值替换为默认值

时间:2020-09-16 12:29:37

标签: python django

我想用默认值替换django对象中的空值:

示例:

class Buy(models.Model):
    created = models.DateTimeField(null=True, blank=True, editable=False,default=timezone.now)
    modified = models.DateTimeField(null=True, blank=True,default=timezone.now)
    name = models.CharField(null=True,blank=True,  max_length=200,default='')

这是我的剧本:

for buy in Buy.objects.all():
    for f in Buy._meta.get_fields():
        field = eval("buy." + f.name+" is None")
        if field:
            field = Buy._meta.get_field(f.name).get_default()
        buy.save()

但是当我使用dumpdata进行json导出时,我仍然有

“名称”:null,

在我的json中代替了很多对象

“名称”:“”

我不理解将我的对象的null值迁移到“”的脚本似乎是正确的。

致谢

1 个答案:

答案 0 :(得分:1)

首先,请勿使用eval,因为它不安全。 99%的时间有更好的方法。

第二,更改局部变量将无效。函数返回并弹出堆栈框时,替换的值将被破坏。

因此,我建议使用getattr()setattr()来执行查询:

setattr(buy, f.name, getattr(buy, f.name) or Buy._meta.get_field(f.name).get_default())
buy.save()

此一线将通过or的魔力将任何伪造的值替换为默认值。然后,我们可以使用setattr将正确的值分配给正确的属性。无需eval