2
votes

Le backend de la base de données n'accepte pas 0 comme valeur pour AutoField

J'ai un modèle:

  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.

J'essaye de changer le statut en ARCHIVE par ce code:

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

et obtenez cette erreur:

Le backend de la base de données n'accepte pas 0 comme valeur pour AutoField.

Le champ status n'est pas AutoField . Pourquoi cette erreur s'est-elle produite?

MISE À JOUR:

trace complète de la pile:

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


9 commentaires

Aucun champ de modèle status n'est défini. Comment attribuez-vous test.status ?


@nik_m désolé mec, je mets à jour la question.


Pouvez-vous afficher la trace complète de la pile? Et montrez-nous davantage votre point de vue? Comme vous le dites, ce n'est pas test.field_15 qui cause l'erreur, donc le problème est ailleurs.


@dirkgroten merci, mec. Je mets à jour la question et ajoute le vrai nom des champs et la trace complète de la pile.


cela arrive-t-il aussi si vous faites test.save (update_fields = ['status']) ?


@dirkgroten Yesssssssss, cela a fonctionné. Merci. Veuillez envoyer ceci comme réponse à J'accepte. Merci beaucoup.


mais ce n'est pas une réponse, c'est une solution de contournement (ou mieux, essayer de comprendre ce qui se passe). Je ne sais pas pourquoi le simple fait d'économiser ne fonctionnerait pas. cela va vous causer plus de problèmes sur toute la ligne. ce que vous devez faire est d'ajouter vos champs du modèle un par un ( test.save (update_fields = ['status', 'tour_from']) , etc ...) jusqu'à ce que vous trouviez le coupable.


ou regardez dans votre base de données directement en utilisant SQL. Peut-être quelque chose de corrompu là-bas. S'il ne s'agit que de votre base de données de développement, pas de problème. supprimez la ligne et recommencez.


J'ai aussi ce problème. J'ai nettoyé la base de données et l'ai réinitialisée avec makemigrations et migrer. J'utilise l'interface d'administration pour ajouter un nouvel enregistrement à une table vide (toutes les tables de ce projet sont vides), et cette table n'a pas de clés étrangères. Ce que je vois, c'est que cela semble échouer lorsqu'il enregistre le changement.


3 Réponses :


0
votes

Ce que vous faites devrait fonctionner. Puisque l'objet est déjà dans la base de données, il est étrange que sa mise à jour avec les mêmes champs conduise à un 0 quelque part (probablement l'une des clés étrangères).

Vous devriez déboguer ceci et il y a deux façons de procéder:

  • Inspectez votre base de données à l'aide de SQL brut. manage.py dbshell ouvre un shell SQL dans lequel vous pouvez effectuer SELECT * FROM my_app_tour WHERE id = 1 . Regardez la ligne en particulier, vous pourrez peut-être repérer le problème.
  • Essayez test.save (update_fields = ['status']) . Si cela fonctionne, ajoutez plus de champs pour mettre à jour un par un, par exemple test.save (update_fields = ['status', 'tour_from'] , puis test.save (update_fields ['status', 'tour_from', 'tour_to']) ... jusqu'à ce que l'erreur soit à nouveau renvoyée.

Je soupçonne une corruption de la base de données, mais il pourrait y avoir un autre problème plus sérieux dans la façon dont vous créez les objets. Cela poserait des problèmes sur toute la ligne.


3 commentaires

L'erreur s'est produite lorsque j'ai ajouté creator à test.save


Cela arrive-t-il avec n'importe quelle ligne ( pk ) ou juste celle-ci. Comment avez-vous créé l'objet en premier lieu?


Pour n'importe quelle ligne, cela s'est produit.



2
votes

Vous avez probablement un champ de clé étrangère qui contient un 0 (au lieu de null ou une valeur valide). Si vous ne disposez pas des contraintes de clé étrangère appropriées au niveau de la base de données (ou si vous avez désactivé les vérifications de clé étrangère lorsque vous avez ajouté les contraintes), rien n'empêche les références de clé étrangère non valides d'exister dans cette ligne.

Vérifiez les données dans tous vos champs de clé étrangère pour un 0: tour_from , tour_to , compagnie aérienne , train , bus , utilisateur , créateur .


0 commentaires

0
votes

Vérifiez votre table django_content_type, recherchez les 0 dans la colonne id. Django enregistre les opérations de la base de données après chaque appel et écrit l'ID du type de contenu.

J'ai trouvé que j'avais plusieurs entrées avec un identifiant 0. Mettre à jour ces derniers avec des numéros uniques après la fin de la séquence et redémarrer Django a corrigé ce problème pour moi.

Honnêtement, je n'ai aucune idée de comment ça s'est passé. J'utilise Django 2.2.


0 commentaires