首页 文章

完整性错误:使用primary_key = True

提问于
浏览
0

这是我的型号:

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 回答

  • 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使用类型为“models.AutoField”的“id”字段,并自动递增该值(无需指定id的值) .

    如果您有兴趣了解它在内部如何工作,您可以阅读数据库中的序列(Django在内部执行的操作是在数据库中为表创建序列,并且您的数据库具有id列的默认值)

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

相关问题