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)
在你的情况下,我会建议一个自定义模型字段,它继承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/
| 归档时间: |
|
| 查看次数: |
3623 次 |
| 最近记录: |