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?
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')
3 Réponses :
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:
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. 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.
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.
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 .
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.
Aucun champ de modèle
statusn'est défini. Comment attribuez-voustest.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_15qui 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.