【问题标题】:django 2 mysql database backend does not accept 0 as a value efor AutoField errordjango 2 mysql 数据库后端不接受 0 作为 AutoField 错误的值
【发布时间】:2019-06-12 15:59:37
【问题描述】:

我不知道为什么:makemigrations 命令工作正常,但是当我从浏览器插入内容时,终端输出错误消息...

文件 “D:\software\WinPython-64bit-3.5.4.0Qt5\python-3.5.4.amd64\lib\site-packages\django\db\backends\mysql\operations.py”,第 172 行,在 validate_autopk_value raise ValueError('The database backend does not accept 0 as a ' ValueError: The database backend does not accept 0 as a value for 自动字段。

在我的笔记/models.py中

class notecategory(models.Model):
    categoryname = models.CharField(max_length=150,null=False,default="")

    isPublic = models.BooleanField()
    owner = models.ForeignKey(User,on_delete=models.CASCADE,null=True,related_name='%(class)s_requests_created')


class note2(models.Model):
    category = models.ForeignKey(notecategory,on_delete=models.CASCADE,null=True)
    content = models.CharField(max_length =settings.CONSTANT_DICT['noteContentLen'] ,null=True)
    book = models.ForeignKey(book,on_delete=models.CASCADE,null=True)
    chapter = models.ForeignKey(chapter,on_delete=models.CASCADE,null=True)
    sentence = models.ForeignKey(sentence,on_delete=models.CASCADE,null=True)
    anchorAt = models.IntegerField(null=True)
    highlightLen = models.IntegerField(null=True)
    language = models.ForeignKey(language,on_delete=models.CASCADE, null=True)
    owner = models.ForeignKey(User, on_delete=models.CASCADE, null=True,related_name='%(class)s_requests_created')

在我的笔记/views.py中

toSave = note2(book_id=int(bookId),chapter=chapterInstance, sentence_id = int(sentenceId),
              category_id=int(categoryId), content=userInputNoteContent,anchorAt = int(anchorAt),highlightLen=int(highlightLen),
              language=languageInstance,
              owner=userInstance)
toSave.save()

在 note/migrations/001_initial.py 中

class Migration(migrations.Migration):

    initial = True

    dependencies = [
        ('sentence', '0008_auto_20190118_1608'),
        ('language', '0001_initial'),
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
    ]

    operations = [
        migrations.CreateModel(
            name='note2',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('content', models.CharField(max_length=150, null=True)),
                ('anchorAt', models.IntegerField(null=True)),
                ('highlightLen', models.IntegerField(null=True)),
                ('book', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='sentence.book')),
            ],
        ),
        migrations.CreateModel(
            name='notecategory',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('categoryname', models.CharField(default='', max_length=150)),
                ('isPublic', models.BooleanField()),
                ('owner', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='notecategory_requests_created', to=settings.AUTH_USER_MODEL)),
            ],
        ),
        migrations.AddField(
            model_name='note2',
            name='category',
            field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='note.notecategory'),
        ),
        migrations.AddField(
            model_name='note2',
            name='chapter',
            field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='sentence.chapter'),
        ),
        migrations.AddField(
            model_name='note2',
            name='language',
            field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='language.language'),
        ),
        migrations.AddField(
            model_name='note2',
            name='owner',
            field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='note2_requests_created', to=settings.AUTH_USER_MODEL),
        ),
        migrations.AddField(
            model_name='note2',
            name='sentence',
            field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='sentence.sentence'),
        ),
    ]

完整跟踪 我从另一个类似的模型/应用中粘贴了错误,因为我没有复制原始消息

[2019 年 1 月 18 日 19:46:47] "GET /readbook/?HTTP/1.1" 200 5809 内部服务器错误:/savenote/ 回溯(最近一次通话最后): 文件 "D:\software\WinPython-64bit-3.5.4.0Qt5\python-3.5.4.amd64\lib\site-packages\django\core\handlers\exception.py", 第 34 行,在内部 响应 = get_response(请求) 文件 "D:\software\WinPython-64bit-3.5.4.0Qt5\python-3.5.4.amd64\lib\site-packages\django\core\handlers\base.py", 第 126 行,在 _get_response 中 response = self.process_exception_by_middleware(e, request) 文件 "D:\software\WinPython-64bit-3.5.4.0Qt5\python-3.5.4.amd64\lib\site-packages\django\core\handlers\base.py", 第 124 行,在 _get_response 响应 = Wrapped_callback(request, *callback_args, **callback_kwargs) 文件“D:\pythonworkspace\notetaking\read\views.py”,第 143 行,在 savenote 中 toSave.save() 文件“D:\software\WinPython-64bit-3.5.4.0Qt5\python-3.5.4.amd64\lib\site-packages\django\db\models\base.py”,第 717 行,保存 force_update=force_update,update_fields=update_fields) 文件“D:\software\WinPython-64bit-3.5.4.0Qt5\python-3.5.4.amd64\lib\site-packages\django\db\models\base.py”,第 747 行,在 save_base 更新 = self._save_table(raw, cls, force_insert, force_update, using, update_fields) _save_table 中的文件“D:\software\WinPython-64bit-3.5.4.0Qt5\python-3.5.4.amd64\lib\site-packages\django\db\models\base.py”,第 830 行 结果 = self._do_insert(cls._base_manager, using, fields, update_pk, raw) 文件“D:\software\WinPython-64bit-3.5.4.0Qt5\python-3.5.4.amd64\lib\site-packages\django\db\models\base.py”,第 868 行,在 _do_insert 使用=使用,原始=原始) 文件 "D:\software\WinPython-64bit-3.5.4.0Qt5\python-3.5.4.amd64\lib\site-packages\django\db\models\manager.py", 第 82 行,在 manager_method 中 返回 getattr(self.get_queryset(), name)(*args, **kwargs) 文件 "D:\software\WinPython-64bit-3.5.4.0Qt5\python-3.5.4.amd64\lib\site-packages\django\db\models\query.py", 第 1133 行,在 _insert 中 return query.get_compiler(using=using).execute_sql(return_id) 文件 "D:\software\WinPython-64bit-3.5.4.0Qt5\python-3.5.4.amd64\lib\site-packages\django\db\models\sql\compiler.py", 第 1284 行,在 execute_sql 中 对于 sql,self.as_sql() 中的参数: 文件 "D:\software\WinPython-64bit-3.5.4.0Qt5\python-3.5.4.amd64\lib\site-packages\django\db\models\sql\compiler.py", 第 1237 行,在 as_sql 中 对于 self.query.objs 中的 obj 文件 "D:\software\WinPython-64bit-3.5.4.0Qt5\python-3.5.4.amd64\lib\site-packages\django\db\models\sql\compiler.py", 第 1237 行,在 对于 self.query.objs 中的 obj 文件 "D:\software\WinPython-64bit-3.5.4.0Qt5\python-3.5.4.amd64\lib\site-packages\django\db\models\sql\compiler.py", 第 1236 行,在 [self.prepare_value(field, self.pre_save_val(field, obj)) for field in fields] 文件 "D:\software\WinPython-64bit-3.5.4.0Qt5\python-3.5.4.amd64\lib\site-packages\django\db\models\sql\compiler.py", 第 1178 行,在 prepare_value 中 value = field.get_db_prep_save(value, connection=self.connection) 文件 "D:\software\WinPython-64bit-3.5.4.0Qt5\python-3.5.4.amd64\lib\site-packages\django\db\models\fields\related.py", 第 937 行,在 get_db_prep_save 中 返回self.target_field.get_db_prep_save(值,连接=连接) 文件 "D:\software\WinPython-64bit-3.5.4.0Qt5\python-3.5.4.amd64\lib\site-packages\django\db\models\fields__init__.py", 第 790 行,在 get_db_prep_save return self.get_db_prep_value(value, connection=connection,prepared=False) 文件 "D:\software\WinPython-64bit-3.5.4.0Qt5\python-3.5.4.amd64\lib\site-packages\django\db\models\fields__init__.py", 第 957 行,在 get_db_prep_value value = connection.ops.validate_autopk_value(value) 文件“D:\software\WinPython-64bit-3.5.4.0Qt5\python-3.5.4.amd64\lib\site-packages\django\db\backends\mysql\operations.py”,第 172 行,在 validate_autopk_value raise ValueError('数据库后端不接受 0 作为 ' ValueError: 数据库后端不接受 0 作为 AutoField 的值。

【问题讨论】:

  • 你将notecategory id设置为0?
  • 请向我们展示完整错误回溯。
  • 谢谢;我已经编辑过了。我从另一个类似的模型/应用程序中粘贴了错误,因为我没有复制原始消息。我不知道如何很好地制作stackoverflow格式。
  • @ShafikurRahman notecategory id 从 1 开始。我发现我的 sentence_id 被分配为 0。这有关系吗?
  • 是的。 sentence_id 外键,它不是 0

标签: python mysql django


【解决方案1】:

数据库不能接受pkforeign key 值作为0。但是您尝试将0 分配为外键字段的值。所以,错误就出现了。

要解决此问题,请为 pkforeign key 字段类型 intbig int 分配值 > 0。 还补充说,如果您使用UUID 作为您的pk,那么您也不能将0 作为值。

【讨论】:

  • 但是数据库可以。 Django 不允许。
猜你喜欢
  • 2018-08-16
  • 2019-07-19
  • 2013-12-18
  • 2021-11-03
  • 2015-02-17
  • 2015-03-31
  • 2016-02-01
  • 1970-01-01
  • 2015-03-17
相关资源
最近更新 更多