代码之家  ›  专栏  ›  技术社区  ›  Chalist

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

  •  0
  • Chalist  · 技术社区  · 5 年前

    我有一个模型:

    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.
    
    0 回复  |  直到 5 年前
        1
  •  1
  •   Stevy    5 年前

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

    检查0的所有外键字段中的数据: tour_from , tour_to , airline , train , bus , user , creator .

        2
  •  0
  •   dirkgroten    5 年前

    你所做的应该管用。由于对象已经在数据库中,用相同的字段更新它会导致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']) …直到错误再次抛出。

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