2017-10-06 6 views
0

J'ai ajouté un champ à mon modèle et l'ai attaché au modèle utilisateur django via foreignkey.auth.user erreur non résolue django

Mon modèle est:

from django.db import models 
from django.contrib.auth.models import User 

    # Create your models here. 
    class user_files(models.Model): 
     Filename = models.CharField(max_length=50) 
     Browse = models.FileField() 
     Username = models.ForeignKey(User,default=1) 

mais lors de la migration, il me donne erreur:

'valuerror: related model 'auth.user' cannot be resolved.'

Qu'est-ce que cela veut dire et comment résoudre cela? J'ai essayé beaucoup de choses mais je n'ai pas travaillé.

Merci d'avance.

+1

Cette erreur ne provient pas de ce code. –

+0

Copie possible de [Valeur par défaut de la clé étrangère dans Django migrations.AddField] (https://stackoverflow.com/questions/36280253/default-value-for-foreign-key-in-django-migrations-addfield) –

+1

première exécution makemigration et migrate commande sans n'importe quel champ dans models.py puis exécutez à nouveau cette commande après avoir mis quelque chose dans models.py – amrit

Répondre

0

Votre code donne l'impression que vous avez besoin de plus d'aide, au-delà de l'erreur qui s'est produite. Voici mes suggestions pour améliorer votre code en général:

  • La méthode recommandée pour établir des relations au modèle de l'utilisateur est d'utiliser le AUTH_USER_MODEL de réglage.

  • Les noms de classe doivent être conventionnels en Pascal (PascalCase) et au singulier.

  • Les noms de variable, c'est-à-dire aussi les attributs de classe, doivent être par convention dans snake case (snake_case).

Ainsi votre code pourrait être amélioré comme ceci:

from django.conf import settings 
from django.db import models 


class UserFile(models.Model): 
    filename = models.CharField(max_length=50) 
    browse = models.FileField() 
    username = models.ForeignKey(settings.AUTH_USER_MODEL) 

Naming est un sujet important extrême. Vous devriez nommer vos classes, méthodes, attributs très significatifs. L'utilisation de username pour un champ de clé étrangère n'est pas très descriptive. Cette variable ne contient pas la valeur du nom d'utilisateur, mais l'ensemble de l'objet Utilisateur. Avoir un champ filename est également très déroutant, car le FileField enregistre réellement le chemin de fichier et par conséquent le nom de fichier dans la base de données comme une chaîne (varchar).

Le code est écrit une fois, mais lu plusieurs fois. Vos intentions ne sont pas claires pour le lecteur.

Si vous ajoutez le champ username après la migration de ce modèle, vous avez deux premières variantes: champ obligatoire ou facultatif.

Si ce doit être un champ facultatif, vous pouvez autoriser NULL:

username = models.ForeignKey(settings.AUTH_USER_MODEL, null=True) 

Lancez ensuite:

python manage.py makemigrations 
python manage.py migrate 

C'est ainsi plus facile. Mais si ce champ est requis, la migration devra savoir quelle valeur doit être affectée aux entrées présentes dans la table et vous demandera de manière interactive d'ajouter une valeur par défaut. Ce n'est pas la même chose que de spécifier une valeur par défaut en tant qu'option.

Dans votre cas, cela signifie que toutes les futures entrées où le nom d'utilisateur n'est pas explicitement spécifié auront la valeur 1. Voulez-vous vraiment cela? Êtes-vous sûr qu'il existe une entrée avec cette clé primaire dans la table pour les utilisateurs?

EDIT (10/10/2017):

Si vous avez sali avec les migrations, vous pouvez nettoyer manuellement vers le haut. Dans la base de données, il y a une table django_migrations qui garde une trace de toutes les migrations appliquées. Il a quatre colonnes:

----------------------------- 
| id | app | name | applied | 
----------------------------- 

Si vous utilisez MySQL, vous pouvez vérifier les migrations pour votre application avec la commande:

SELECT * FROM django_migrations WHERE app = 'your_app'; 

Supprimer les entrées dans ce tableau et les fichiers dans le répertoire migrations de votre application qui causent des problèmes. Puis recommencez.

+0

HI SIR, J'ai supprimé toutes les entrées du modèle et supprimé la colonne foreignkey du modèle. Mais maintenant, lors de la migration, il indique qu'aucun changement n'a été détecté et lors de l'exécution sur l'hôte local, il lance l'erreur "no such column: Box_user_files.Username_id" –

+0

Veuillez voir ma modification concernant les migrations. – cezar