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

时间:2019-02-15 16:58:10

标签: 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

    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')

我尝试通过以下代码将状态更改为ARCHIVE

test = Tour.objects.get(id=self.kwargs['pk'])
test.status = ARCHIVE
test.save()

并收到此错误:

  

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

status字段不是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.

3 个答案:

答案 0 :(得分:1)

您的外键字段可能包含0(而不是null或有效值)。如果您在数据库级别没有适当的外键约束(或者在添加约束时关闭了外键检查),那么没有什么可以防止该行中存在无效的外键引用的。

检查所有外键字段中的数据是否为0:tour_fromtour_toairlinetrainbususercreator

答案 1 :(得分:0)

您正在做的事情应该可以工作。由于对象已经存在于数据库中,所以奇怪的是,使用相同的字段对其进行更新会导致某处为0(可能是外键之一)。

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

  • 使用原始SQL检查数据库。 manage.py dbshell打开一个SQL Shell,您可以在其中执行SELECT * FROM my_app_tour WHERE id = 1。查看特定的行,也许您可​​以发现问题。
  • 尝试test.save(update_fields=['status'])。如果可行,请添加更多字段以逐一更新,例如test.save(update_fields=['status', 'tour_from'],然后是test.save(update_fields['status', 'tour_from', 'tour_to']) ...,直到再次引发错误为止。

我怀疑数据库损坏,但是在创建对象的方式上可能还有其他更严重的问题。那会带来问题。

答案 2 :(得分:0)

检查您的django_content_type表,在id列中查找0。 Django在每次调用后记录数据库操作,并写入内容类型的ID。

我发现我有几个ID为0的条目。在序列结束后用唯一编号更新它们,然后重新启动Django为我解决了这个问题。

老实说,我不知道那是怎么回事。我正在使用Django 2.2。