我想在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)
答案 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。