Django:自动将模型字段中的空字符串设置为None?

时间:2011-08-14 19:41:16

标签: django django-models

我想在Django模型中迭代我的模型字段并检查它们是否为空字符串,并以编程方式在模型save()方法中用null替换它们。这是因为一些CharField需要是唯一的或没有价值。

示例:

class Person(models.Model):
    name = models.CharField(blank=True, unique=True, null=True)
    nick_name = models.CharField(blank=True, unique=True, null=True)
    ...
    age = models.IntegerField()

    def save(self, *args, **kwargs):
        for field in self._meta.fields: # get the model fields
            if field=='':
                field = None
       super(Person, self).save(*args, **kwargs)

上面抱怨一个creation_counter,不清楚为什么要尝试将这些值而不是字段值与空字符串进行比较。

这可以手动完成,但我的模型太多了......

有什么建议吗?

编辑: 感谢所有试图帮助我的人! :d

似乎对我有用的解决方案是由Jazz发布的,但是他的代码没有出现在他的帖子中。这是我的版本基本相同,但需要额外检查以确保我们只在必要时覆盖:

from django.db.models.Field import CharField as _CharField

class CharField(_CharField):
    def get_db_prep_value(self, value, *args, **kwargs):
        if self.blank == self.null == self.unique == True and value == '':
            value = None

        return super(CharField).get_db_prep_value(value, *args, **kwargs)

2 个答案:

答案 0 :(得分:8)

在您的情况下,我会建议一个自定义模型字段,该字段是CharField的子类,并确保将空字符串转换为None - 覆盖get_db_prep_value应该这样做。< / p>

class EmptyStringToNoneField(models.CharField):
    def get_prep_value(self, value):
        if value == '':
            return None  
        return value

class Person(models.Model):
    name = EmptyStringToNoneField(blank=True, unique=True, null=True)
    nick_name = EmptyStringToNoneField(blank=True, unique=True, null=True)

https://docs.djangoproject.com/en/dev/howto/custom-model-fields/

答案 1 :(得分:0)

爵士乐的回答对我来说就像是一种魅力。

我只想指出,如果您使用的是南迁移工具,schemamigration命令将失败,除非您为新的自定义字段指定内省规则

对于“简单字段”,您只需将以下代码添加到指定字段的任何位置即可。

from south.modelsinspector import add_introspection_rules
add_introspection_rules([], ["^myapp\.stuff\.fields\.SomeNewField"])

现在南迁移应该有效。

FYI。

参考:http://south.aeracode.org/wiki/MyFieldsDontWork