我已向管理员添加了新模型。这是我的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
,但我仍在添加记录。怎么可能?
答案 0 :(得分:8)
此问题的部分原因是未正确使用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以避免在使用空值保存多个对象时发生唯一约束违规。
我强烈建议您从CharField
和TextField
中删除此参数。
还要确保运行./manage.py makemigrations && ./manage.py migrate
。
答案 1 :(得分:3)
答案简短here。
如果将字段指定为非空字段,则django将要求您在代码本身中提供默认值,或者在运行迁移时要求您提供默认值。
更好的方法是在models.py本身中提供一些理智的默认值。之后运行python manage.py makemigrations
和python manage.py migrate
。你应该没事。