完整性错误:使用primary_key = True

时间:2018-01-25 03:32:31

标签: django

这是我的模特:

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)

发生此错误:

追踪(最近一次呼叫最后一次):

文件“”,第1行,

文件“C:\ Python34 \ lib \ site-packages \ django \ db \ models \ manager.py”,第85行,在manager_method中

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)

文件“C:\ Python34 \ lib \ site-packages \ django \ db \ models \ base.py”,第836行,在save_base中

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)

文件“C:\ Python34 \ lib \ site-packages \ django \ db \ models \ manager.py”,第85行,在manager_method中

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)

文件“C:\ Python34 \ lib \ site-packages \ django \ db \ models \ sql \ compiler.py”,第1099行,在execute_sql中

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行,退出

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 个答案:

答案 0 :(得分:2)

创建BookMark对象时,未传递主键值(id)。

按以下方式更改您的创建

bookmark = Bookmark.objects.create(name='First Bookmark', url='example.com', user=user, id=<some_int_which_hasnt_been_used>)  # Use an id that you know you hasn't been used.

现在你必须这样做是因为你已经定义了自己的主键,所以Django不会自动为你创建它。

当你没有指定主键时,Django会使用&#34; id&#34;字段类型&#34; models.AutoField&#34;,并自动递增值(无需指定id的值)。

如果您有兴趣知道它如何在内部工作,您可以阅读数据库中的序列(Django内部在表中为数据库创建一个序列,并且您的数据库具有您的id列的默认值)

我不确定为什么你已经覆盖了Django自动提供的id字段(因为你的id是PositiveIntegerField,而AutoField无论如何都只生成正值),所以如果你没有特定的理由来定义PK ,我建议你选择Django为你创造的东西。