59 votes

Avertissement sur l'utilisation d'une clé primaire auto-créée sans définir de type de clé primaire dans Django

Je viens de mettre à jour mon python de 3.9.1 à 3.9.4. Quand j'ai essayé de lancer le serveur. La console m'a donné un avertissement pour ceci :

WARNINGS:
learning_logs.Entry: (models.W042) Auto-created primary key used when not defining a primary key type, by default 'django.db.models.AutoField'.
HINT: Configure the DEFAULT_AUTO_FIELD setting or the LearningLogsConfig.default_auto_field attribute to point to a subclass of AutoField, e.g. 'django.db.models.BigAutoField'.
learning_logs.Topic: (models.W042) Auto-created primary key used when not defining a primary key type, by default 'django.db.models.AutoField'.
HINT: Configure the DEFAULT_AUTO_FIELD setting or the LearningLogsConfig.default_auto_field attribute to point to a subclass of AutoField, e.g. 'django.db.models.BigAutoField'.
No changes detected in app 'learning_logs'

Puis-je savoir comment résoudre ce problème ? J'ai lu la documentation à ce sujet, mais je ne comprends pas comment cette partie cette page s'y rapporte.

Modèles.py

from django.db import models
from django.contrib.auth.models import User
# Create your models here.

class Topic(models.Model):
    text = models.CharField(max_length = 200)
    date_added = models.DateTimeField(auto_now_add = True)
    image = models.ImageField(upload_to = 'backgroud_images', null = True, blank = True)
    owner = models.ForeignKey(User,on_delete = models.CASCADE)
    def __str__(self):
        return self.text

class Entry(models.Model):
    topic = models.ForeignKey(Topic,on_delete = models.CASCADE)
    text = models.TextField()
    date_added = models.DateTimeField(auto_now_add = True)

    class Meta:
        verbose_name_plural = "Entries"

    def __str__(self):
        return self.text[:50]

97voto

Nuts Points 1548

Vos modèles n'ont pas de clés primaires. Mais elles sont créées automatiquement par django.

Vous devez choisir le type de clés primaires créées automatiquement. https://docs.djangoproject.com/en/3.2/releases/3.2/#customizing-type-of-auto-created-primary-keys (nouveau dans Django 3.2)

Soit vous ajoutez ceci dans settings.py DEFAULT_AUTO_FIELD='django.db.models.AutoField'

ou

class Topic(models.Model):
    id = models.AutoField(primary_key=True)
    ...

19voto

iklinac Points 4196

Vous avez involontairement mis à jour Django à la version 3.2, ce qui vous avertit et, comme le suggère le texte de l'indice, vous devez configurer DEFAULT_AUTO_FIELD comme documenté De cette façon, vous évitez les migrations non souhaitées dans les futures versions, car valeur de DEFAULT_AUTO_FIELD sera changé en BigAutoField

Vous devez définir DEFAULT_AUTO_FIELD explicitement au courant DEFAULT_AUTO_FIELD valeur

DEFAULT_AUTO_FIELD = 'django.db.models.AutoField'

vous pourriez le configurer même par application (si vous prévoyez de créer de nouvelles applications avec le style actuel de clé primaire)

from django.apps import AppConfig

class MyAppConfig(AppConfig):
    default_auto_field = 'django.db.models.AutoField'
    name = 'my_app'

ou même par modèle ( discursif )

from django.db import models

class MyModel(models.Model):
    id = models.AutoField(primary_key=True)

Vous devez également veiller à verrouiller la version de vos exigences, car vous risquez d'introduire des modifications incompatibles avec le passé dans la production.

6voto

Ali Aref Points 506

Nouveau projet créé settings.py dans django 3.2 comprend ceci :

..

# Default primary key field type
# https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field

DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

et comme votre projet a été créé sur des versions antérieures de django alors vous pouvez ajouter ceci à vos paramètres.

1voto

Himaloy Mondal Points 11
models.py:
       class Topic(models.Model):
           id = models.AutoField(primary_key=True)

primary_key=True https://docs.djangoproject.com/en/3.2/ref/models/fields/#primary-key

settings.py:
DEFAULT_AUTO_FIELD = 'django.db.models.AutoField'

DEFAULT_AUTO_FIELD https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field

0voto

Mayur Gupta Points 80

Une solution simple :

Django veut que vous ajoutiez le numéro de série qui est appelé par la clé primaire et si vous pouvez ignorer cet avertissement, alors django ajoutera automatiquement la clé primaire ; sinon, si vous voulez supprimer cet avertissement, ajoutez ce code dans votre modèle défini :

id = models.AutoField(primary_key=True)

Par exemple :

class Contact(models.Model):
    sno = models.AutoField(primary_key=True)
    name = models.CharField(max_length=25, blank=True)
    email = models.EmailField(max_length=40, blank=True)
    phone = models.IntegerField()

Codage de HaPpY

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X