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

Rub*_*ben 10 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

IntegrityError at /admin/extras/engineeringtoolattributetype/add/
null value in column "name" violates not-null constraint
Run Code Online (Sandbox Code Playgroud)

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

Sar*_*iev 9

此问题部分是由于未正确使用CharField而导致的TextField.您几乎不应该null=True在此字段及其子类上使用. https://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以避免在使用空值保存多个对象时发生唯一约束违规.

我强烈建议从你的CharFields和TextFields中删除这个参数.

也是为了确保运行./manage.py makemigrations && ./manage.py migrate.

  • 事实上,name 不是 NULL(你可以在我的模型中看到它),这没问题,但我还是遇到了“null”问题 (3认同)

rma*_*d17 3

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