Mysql 数据库后端不接受0作为AutoField的值

Mysql 数据库后端不接受0作为AutoField的值,mysql,django,Mysql,Django,我有一个模型: class Tour(models.Model): INACTIVE = 0 ACTIVE = 1 ARCHIVE = 2 STATUS = ( (INACTIVE, "Inactive"), (ACTIVE, "Active"), (ARCHIVE, "Archive"), ) AIR_TOUR = 0 GROUND_TOUR = 1 SEA_TOUR = 2

我有一个模型:

class Tour(models.Model):
    INACTIVE = 0
    ACTIVE = 1
    ARCHIVE = 2

    STATUS = (
        (INACTIVE, "Inactive"),
        (ACTIVE, "Active"),
        (ARCHIVE, "Archive"),
    )

    AIR_TOUR = 0
    GROUND_TOUR = 1
    SEA_TOUR = 2

    T_TYPES = (
        (AIR_TOUR, "Air_tour"),
        (GROUND_TOUR, "Ground_tour"),
        (SEA_TOUR, "Sea_tour"),
    )

    title = models.CharField(max_length=200)
    tour_from = models.ForeignKey(Airport, related_name='from_location')
    tour_to = models.ForeignKey(Airport, related_name='to_location')
    duration_day = models.IntegerField(default=1, blank=True, null=True)
    duration_night = models.IntegerField(default=1, blank=True, null=True)
    transport_type = models.IntegerField(default=AIR_TOUR, choices=T_TYPES, blank=True, null=True)
    documents = models.TextField(default='', blank=True, null=True)
    description = models.TextField(blank=True, null=True, default='')
    services = models.TextField(blank=True, null=True, default='')

    airline = models.ForeignKey(Airline, null=True, blank=True)
    train = models.ForeignKey(Train, null=True, blank=True)
    bus = models.ForeignKey(Bus, null=True, blank=True)

    user = models.ForeignKey(User, related_name='user')
    creator = models.ForeignKey(User, related_name='creator')
    status = models.IntegerField(default=INACTIVE, choices=STATUS, blank=True, null=True)
    create_at = models.DateTimeField(default='2000-10-10')
    update_at = models.DateTimeField(default='2000-10-10')
我尝试通过以下代码将状态更改为
存档

test = Tour.objects.get(id=self.kwargs['pk'])
test.status = ARCHIVE
test.save()
并获取以下错误:

数据库后端不接受0作为AutoField的值

状态
字段不是
自动字段
。为什么会发生这种错误

更新: 完整堆栈跟踪:

  Django version 1.11, using settings 'project.settings_local'
Starting development server at http://0.0.0.0:8888/
Quit the server with CONTROL-C.
Internal Server Error: /dashboard/tour/delete/1/
Traceback (most recent call last):
  File "/home/.virtualenvs/project/lib/python3.6/site-packages/django/core/handlers/exception.py", line 41, in inner
    response = get_response(request)
  File "/home/.virtualenvs/project/lib/python3.6/site-packages/django/core/handlers/base.py", line 187, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/home/.virtualenvs/project/lib/python3.6/site-packages/django/core/handlers/base.py", line 185, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/.virtualenvs/project/lib/python3.6/site-packages/django/contrib/auth/decorators.py", line 23, in _wrapped_view
    return view_func(request, *args, **kwargs)
  File "/home/.virtualenvs/project/lib/python3.6/site-packages/django/views/generic/base.py", line 68, in view
    return self.dispatch(request, *args, **kwargs)
  File "/home/.virtualenvs/project/lib/python3.6/site-packages/django/views/generic/base.py", line 88, in dispatch
    return handler(request, *args, **kwargs)
  File "/home/py/project/dashboard/views_tour.py", line 196, in post
    tour.save()
  File "/home/.virtualenvs/project/lib/python3.6/site-packages/django/db/models/base.py", line 806, in save
    force_update=force_update, update_fields=update_fields)
  File "/home/.virtualenvs/project/lib/python3.6/site-packages/django/db/models/base.py", line 836, in save_base
    updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
  File "/home/.virtualenvs/project/lib/python3.6/site-packages/django/db/models/base.py", line 903, in _save_table
    forced_update)
  File "/home/.virtualenvs/project/lib/python3.6/site-packages/django/db/models/base.py", line 953, in _do_update
    return filtered._update(values) > 0
  File "/home/.virtualenvs/project/lib/python3.6/site-packages/django/db/models/query.py", line 661, in _update
    return query.get_compiler(self.db).execute_sql(CURSOR)
  File "/home/.virtualenvs/project/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 1191, in execute_sql
    cursor = super(SQLUpdateCompiler, self).execute_sql(result_type)
  File "/home/.virtualenvs/project/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 863, in execute_sql
    sql, params = self.as_sql()
  File "/home/.virtualenvs/project/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 1157, in as_sql
    val = field.get_db_prep_save(val, connection=self.connection)
  File "/home/.virtualenvs/project/lib/python3.6/site-packages/django/db/models/fields/related.py", line 963, in get_db_prep_save
    return self.target_field.get_db_prep_save(value, connection=connection)
  File "/home/.virtualenvs/project/lib/python3.6/site-packages/django/db/models/fields/__init__.py", line 766, in get_db_prep_save
    prepared=False)
  File "/home/.virtualenvs/project/lib/python3.6/site-packages/django/db/models/fields/__init__.py", line 955, in get_db_prep_value
    value = connection.ops.validate_autopk_value(value)
  File "/home/.virtualenvs/project/lib/python3.6/site-packages/django/db/backends/mysql/operations.py", line 155, in 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 AutoField.
Internal Server Error: /dashboard/tour/delete/1/
Traceback (most recent call last):
  File "/home/.virtualenvs/project/lib/python3.6/site-packages/django/core/handlers/exception.py", line 41, in inner
    response = get_response(request)
  File "/home/.virtualenvs/project/lib/python3.6/site-packages/django/core/handlers/base.py", line 187, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/home/.virtualenvs/project/lib/python3.6/site-packages/django/core/handlers/base.py", line 185, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/.virtualenvs/project/lib/python3.6/site-packages/django/contrib/auth/decorators.py", line 23, in _wrapped_view
    return view_func(request, *args, **kwargs)
  File "/home/.virtualenvs/project/lib/python3.6/site-packages/django/views/generic/base.py", line 68, in view
    return self.dispatch(request, *args, **kwargs)
  File "/home/.virtualenvs/project/lib/python3.6/site-packages/django/views/generic/base.py", line 88, in dispatch
    return handler(request, *args, **kwargs)
  File "/home/py/project/dashboard/views_tour.py", line 196, in post
    tour.save()
  File "/home/.virtualenvs/project/lib/python3.6/site-packages/django/db/models/base.py", line 806, in save
    force_update=force_update, update_fields=update_fields)
  File "/home/.virtualenvs/project/lib/python3.6/site-packages/django/db/models/base.py", line 836, in save_base
    updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
  File "/home/.virtualenvs/project/lib/python3.6/site-packages/django/db/models/base.py", line 903, in _save_table
    forced_update)
  File "/home/.virtualenvs/project/lib/python3.6/site-packages/django/db/models/base.py", line 953, in _do_update
    return filtered._update(values) > 0
  File "/home/.virtualenvs/project/lib/python3.6/site-packages/django/db/models/query.py", line 661, in _update
    return query.get_compiler(self.db).execute_sql(CURSOR)
  File "/home/.virtualenvs/project/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 1191, in execute_sql
    cursor = super(SQLUpdateCompiler, self).execute_sql(result_type)
  File "/home/.virtualenvs/project/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 863, in execute_sql
    sql, params = self.as_sql()
  File "/home/.virtualenvs/project/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 1157, in as_sql
    val = field.get_db_prep_save(val, connection=self.connection)
  File "/home/.virtualenvs/project/lib/python3.6/site-packages/django/db/models/fields/related.py", line 963, in get_db_prep_save
    return self.target_field.get_db_prep_save(value, connection=connection)
  File "/home/.virtualenvs/project/lib/python3.6/site-packages/django/db/models/fields/__init__.py", line 766, in get_db_prep_save
    prepared=False)
  File "/home/.virtualenvs/project/lib/python3.6/site-packages/django/db/models/fields/__init__.py", line 955, in get_db_prep_value
    value = connection.ops.validate_autopk_value(value)
  File "/home/.virtualenvs/project/lib/python3.6/site-packages/django/db/backends/mysql/operations.py", line 155, in 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 AutoField.

你所做的应该有用。因为对象已经在数据库中,所以奇怪的是,用相同的字段更新它会导致某个地方出现0(可能是其中一个外键)

您应该对此进行调试,有两种方法:

  • 使用原始SQL检查数据库
    manage.py dbshell
    打开一个SQL shell,您可以在其中执行
    SELECT*FROM my_app_tour,其中id=1
    。看看这一行,也许你能发现问题所在
  • 尝试
    test.save(更新字段=['status'])
    。如果可行,请添加更多字段以逐个更新,例如
    test.save(更新字段=['status','tour\u from']
    ,然后
    test.save(更新字段['status','tour\u from','tour\u to'])
    ,直到再次抛出错误

我怀疑数据库已损坏,但在创建对象的方式上可能存在其他更严重的问题。这将导致后续问题。

您可能有一个包含0(而不是null或有效值)的外键字段。如果在DB级别没有适当的外键约束(或者在添加约束时关闭了外键检查),无法阻止该行中存在无效的外键引用

检查所有外键字段中的数据,查看0:
tour\u from
tour\u to

航空公司
火车
公共汽车
用户
创建者
,检查django\u内容类型表,在id列中查找0。django在每次调用后记录数据库操作,并写入内容类型的id

我发现我有几个id为0的条目。在序列结束后用唯一的数字更新这些条目并重新启动Django为我解决了这个问题


老实说,我不知道它是怎么变成这样的。我使用的是Django 2.2。

没有定义
状态
模型字段。如何分配
测试。状态
?@nik\u m抱歉,伙计,我更新了问题。你能显示完整的堆栈跟踪吗?并向我们展示更多的视图吗?正如你所说的,不是
测试。字段15
导致错误,所以问题在别处。@dirkgroten谢谢,伙计。我更新了问题,添加了字段的真实名称和完整的堆栈跟踪。但这不是答案,这是一个解决办法(或者更好,尝试弄清楚发生了什么)。我不知道为什么保存不起作用。这会给您带来更多麻烦。您应该做的是逐个添加模型的字段(
test.save(update_fields=['status','tour_from'])
,等等。)直到找到罪魁祸首。错误发生在我将
creator
添加到
test时。save
是否发生在任何一行(
pk
)上,还是仅发生在这一行上。您最初是如何创建对象的?对于发生过的任何一行。