web-dev-qa-db-fra.com

Une valeur nulle dans la colonne "nom" viole la contrainte non nulle lors de l'ajout d'un nouvel élément dans Django admin

J'ai ajouté un nouveau modèle à mon administrateur. Voici mes models.py:

class EngineeringToolAttributeType(models.Model):
    name = models.CharField(max_length=50)
    description = models.CharField(max_length=255, blank=True, null=True)
    api_url = models.CharField(max_length=255, blank=True, null=True)
    api_field = models.CharField(max_length=50, blank=True, null=True)
    active = models.BooleanField(default=True)

    def __str__(self):
        return self.name

Et le admin.py:

from extras.models import EngineeringToolAttributeType
from Django.contrib import admin

class EngineeringToolAttributeTypeAdmin(admin.ModelAdmin):
    fields = ['name', 'description', 'api_url', 'api_field', 'active']
    list_display = ('name', 'description', 'api_url', 'api_field', 'active')

admin.site.register(EngineeringToolAttributeType, EngineeringToolAttributeTypeAdmin)

Lorsque j'essaie d'ajouter (cliquez sur le bouton Ajouter via l'administrateur), j'obtiens cette erreur:

Internal Server Error: /website/admin/extras/engineeringtoolattributetype/add/

IntegrityError at /admin/extras/engineeringtoolattributetype/add/
null value in column "name" violates not-null constraint

Cela ne s'est jamais produit auparavant. Je sais que le nom ne doit pas être Null, mais j'ajoute toujours un enregistrement. Comment est-ce possible?

10
Ruben

Cela a une réponse courte ici .
Si vous spécifiez un champ comme champ non nul Django vous demandera soit de fournir une valeur par défaut dans le code lui-même, soit il vous demandera de fournir une valeur par défaut lorsque vous exécutez des migrations . Une meilleure approche serait de fournir une valeur par défaut saine dans votre models.py lui-même. Après cela, exécutez python manage.py makemigrations et python manage.py migrate. Ça devrait aller.

3
rmad17

Ce problème est dû en partie à une mauvaise utilisation de CharField et TextField. Vous devriez presque ne jamais utiliser null=True sur ces champs et leurs sous-classes. https://docs.djangoproject.com/en/1.11/ref/models/fields/#Django.db.models.Field.null

Évitez d'utiliser null sur des champs basés sur des chaînes tels que CharField et TextField. Si un champ basé sur une chaîne a null = True, cela signifie qu'il a deux valeurs possibles pour "aucune donnée": NULL et la chaîne vide. Dans la plupart des cas, il est redondant d'avoir deux valeurs possibles pour "pas de données;" la convention Django consiste à utiliser la chaîne vide, pas NULL. Une exception est lorsqu'un CharField a à la fois unique = True et blank = True set. Dans cette situation, null = True est requis pour éviter les violations de contraintes uniques lors de l'enregistrement de plusieurs objets avec des valeurs vides.

Je suggère fortement de supprimer ce paramètre de vos CharFields et TextFields.

Aussi juste pour être sûr d'exécuter ./manage.py makemigrations && ./manage.py migrate.

9