我已将我的Model字段设置为null=True
,它允许在MySQL中使用NULL,但我似乎无法通过Django Admin为该字段分配NULL。我也试过设置blank=True
,但这只是将字段设置为空字符串。 this之后也不起作用,因为字段值设置为“无”,即字符串。
有什么想法吗?
答案 0 :(得分:27)
尝试覆盖模型的save()方法,以检查空值:
class MyModel(models.Model):
my_nullable_string = models.CharField(max_length=15, null=True, blank=True)
def save(self, *args, **kwargs):
if not self.my_nullable_string:
self.my_nullable_string = None
super(MyModel, self).save(*args, **kwargs)
答案 1 :(得分:17)
This section in the docs听起来像是无法通过管理员将基于字符串的字段设置为NULL
;它将使用空字符串。这就是Django的做法。它适用于其他类型的领域。
你要么必须破解管理脚本,要么确定真的在数据库中不需要为NULL;一个空字符串就可以了。
答案 2 :(得分:7)
通常,当您同时传递null=True
和blank=True
时,如果您在管理员中将该字段留空,Django
将使用NULL
作为其值。
编辑:
正如agf
在他的回答中解释的那样,除CharField
和TextField
之外的所有类型都是如此。
答案 3 :(得分:5)
试试这段代码,这里是Language.subregion hass null = True 此代码覆盖管理表单设置(LanguageAdmin)并设置“subregion”字段属性 - 需要为False
from app.models import Language
from django.contrib import admin
class Language(models.Model):
subregion = models.ForeignKey(SubRegion, null=True)
code = models.CharField(max_length=10, unique=True)
class LanguageAdmin(admin.ModelAdmin):
def get_form(self, request, obj=None, **kwargs):
form = super(LanguageAdmin, self).get_form(request, obj, **kwargs)
form.base_fields['subregion'].required = False
return form
admin.site.register(Language, LanguageAdmin)
答案 4 :(得分:4)
我经常将Django用于Admin,并且需要在db中保留很多NULL。我使用此代码段将特定对象上的所有空字符串设置为NULL。
def save(self, *args, **kwargs):
for var in vars(self):
if not var.startswith('_'):
if self.__dict__[var] == '':
self.__dict__[var] = None
super(MyModel, self).save(*args, **kwargs)
答案 5 :(得分:2)
请注意,这在Django 2.0.1中已得到修复 - 从该版本开始,对于可以为空的Charfields,空值将保存为None。
票证:https://code.djangoproject.com/ticket/4136
提交:https://github.com/django/django/commit/267dc4adddd2882182f71a7f285a06b1d4b15af0