在django admin中添加新项时,“name”列中的空值违反了非空约束

时间:2017-06-27 15:01:42

标签: django postgresql django-admin

我已向管理员添加了新模型。这是我的models.py:

class EngineeringToolAttributeType(models.Model):
    name = models.CharField(max_length=50)
    description = models.CharField(max_length=255, blank=True, null=True)
    api_url = models.CharField(max_length=255, blank=True, null=True)
    api_field = models.CharField(max_length=50, blank=True, null=True)
    active = models.BooleanField(default=True)

    def __str__(self):
        return self.name

和admin.py:

from extras.models import EngineeringToolAttributeType
from django.contrib import admin

class EngineeringToolAttributeTypeAdmin(admin.ModelAdmin):
    fields = ['name', 'description', 'api_url', 'api_field', 'active']
    list_display = ('name', 'description', 'api_url', 'api_field', 'active')

admin.site.register(EngineeringToolAttributeType, EngineeringToolAttributeTypeAdmin)

当我尝试添加(通过管理员点击添加按钮)时,我收到此错误:

Internal Server Error: /website/admin/extras/engineeringtoolattributetype/add/

IntegrityError at /admin/extras/engineeringtoolattributetype/add/
null value in column "name" violates not-null constraint

这从未发生过。我知道名字不允许是Null,但我仍在添加记录。怎么可能?

2 个答案:

答案 0 :(得分:8)

此问题的部分原因是未正确使用CharFieldTextField。您应该几乎永远不要在此字段及其子类上使用null=Truehttps://docs.djangoproject.com/en/1.11/ref/models/fields/#django.db.models.Field.null

  

避免在基于字符串的字段(如CharField和TextField)上使用null。如果基于字符串的字段具有null = True,则表示它具有“无数据”的两个可能值:NULL和空字符串。在大多数情况下,为“无数据”提供两个可能的值是多余的; Django约定是使用空字符串,而不是NULL。一个例外是CharField同时具有unique = True和blank = True。在这种情况下,需要null = True以避免在使用空值保存多个对象时发生唯一约束违规。

我强烈建议您从CharFieldTextField中删除此参数。

还要确保运行./manage.py makemigrations && ./manage.py migrate

答案 1 :(得分:3)

答案简短here
如果将字段指定为非空字段,则django将要求您在代码本身中提供默认值,或者在运行迁移时要求您提供默认值。 更好的方法是在models.py本身中提供一些理智的默认值。之后运行python manage.py makemigrationspython manage.py migrate。你应该没事。