这是我的型号:
from django.db import models
from django.contrib.auth.models import User
class Bookmark(models.Model):
id = models.PositiveIntegerField(primary_key=True)
name = models.CharField(max_length=50)
url = models.URLField()
isPublic = models.BooleanField(default=True)
dateTimePosted = models.DateTimeField(auto_now=True,verbose_name="posted at")
user = models.ForeignKey(User, on_delete=models.CASCADE)
这是我的0001_initials.py:
from __future__ import unicode_literals
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
initial = True
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name='Bookmark',
fields=[
('id', models.PositiveIntegerField(primary_key=True, serialize=False)),
('name', models.CharField(max_length=50)),
('url', models.URLField()),
('isPublic', models.BooleanField(default=True)),
('dateTimePosted', models.DateTimeField(auto_now=True, verbose_name='posted at')),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
]
当我使用以下方法插入值时:
python manage.py shell:
>>from django.contrib.auth.models import User
>>user = User.objects.create_user('test', 'test@abc.com', 'test@123')
>>from bookmark.models import Bookmark
>>bookmark = Bookmark.objects.create(name='First Bookmark', url='example.com', user=user)
发生此错误:
Traceback(最近一次调用最后一次):
文件“”,第1行,in
在manager_method中的文件“C:\ Python34 \ lib \ site-packages \ django \ db \ models \ manager.py”,第85行
return getattr(self.get_queryset(), name)(*args, **kwargs)
在创建文件“C:\ Python34 \ lib \ site-packages \ django \ db \ models \ query.py”,第394行
obj.save(force_insert=True, using=self.db)
文件“C:\ Python34 \ lib \ site-packages \ django \ db \ models \ base.py”,第806行,保存
force_update=force_update, update_fields=update_fields)
在save_base中的文件“C:\ Python34 \ lib \ site-packages \ django \ db \ models \ base.py”,第836行
updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
文件“C:\ Python34 \ lib \ site-packages \ django \ db \ models \ base.py”,第922行,在_save_table中
result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
文件“C:\ Python34 \ lib \ site-packages \ django \ db \ models \ base.py”,第961行,在_do_insert中
using=using, raw=raw)
在manager_method中的文件“C:\ Python34 \ lib \ site-packages \ django \ db \ models \ manager.py”,第85行
return getattr(self.get_queryset(), name)(*args, **kwargs)
文件“C:\ Python34 \ lib \ site-packages \ django \ db \ models \ query.py”,第1063行,在_insert中
return query.get_compiler(using=using).execute_sql(return_id)
在execute_sql中的文件“C:\ Python34 \ lib \ site-packages \ django \ db \ models \ sql \ compiler.py”,第1099行
cursor.execute(sql, params)
执行文件“C:\ Python34 \ lib \ site-packages \ django \ db \ backends \ utils.py”,第80行
return super(CursorDebugWrapper, self).execute(sql, params)
执行文件“C:\ Python34 \ lib \ site-packages \ django \ db \ backends \ utils.py”,第65行
return self.cursor.execute(sql, params)
文件"C:\Python34\lib\site-packages\django\db\utils.py",第94行,在 exit
six.reraise(dj_exc_type, dj_exc_value, traceback)
文件“C:\ Python34 \ lib \ site-packages \ django \ utils \ six.py”,第685行,重新加入
raise value.with_traceback(tb)
执行文件“C:\ Python34 \ lib \ site-packages \ django \ db \ backends \ utils.py”,第65行
return self.cursor.execute(sql, params)
执行文件“C:\ Python34 \ lib \ site-packages \ django \ db \ backends \ sqlite3 \ base.py”,第328行
return Database.Cursor.execute(self, query, params)
django.db.utils.IntegrityError:NOT NULL约束失败:bookmark_bookmark.id
如何解决这个错误我删除了数据库(db.sqlite3)和 pycache 文件夹未应用的迁移,然后使用以下命令再次创建:
python manage.py makemigrations
但仍然发生错误
1 回答
在创建BookMark对象时,您没有传递主键值(id) .
更改您的创建如下,
现在你必须这样做是因为你已经定义了自己的主键,所以Django不会自动为你创建它 .
当您没有指定主键时,Django使用类型为“models.AutoField”的“id”字段,并自动递增该值(无需指定id的值) .
如果您有兴趣了解它在内部如何工作,您可以阅读数据库中的序列(Django在内部执行的操作是在数据库中为表创建序列,并且您的数据库具有id列的默认值)
我不确定为什么你已经覆盖了Django自动提供的id字段(因为你的id是PositiveIntegerField,而AutoField无论如何都只生成正值),所以如果你没有特定的理由来定义PK,我建议你去用Django为你创造的东西 .