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

Goo*_*oid 3 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)
Run Code Online (Sandbox Code Playgroud)

上面抱怨了一个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)
Run Code Online (Sandbox Code Playgroud)

jaz*_*azz 8

在你的情况下,我会建议一个自定义模型字段,它继承a CharField并确保将空字符串转换为None- 覆盖get_db_prep_value应该这样做.

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)
Run Code Online (Sandbox Code Playgroud)

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