2016-07-22 1 views
0

J'ai un modèle et je veux ajouter un OneToOneField pour maintenir le créateur d'un objet: models.pyDjango: modèle OneToOneField avec l'utilisateur ne peut pas ajouter de la valeur par défaut

creator = models.OneToOneField(User, blank=True, 
           default=User.objects.filter(
            username="antoni4040")) 

J'ai déjà une base de données avec des éléments et je veux juste que la valeur par défaut soit l'utilisateur admin, qui a le nom d'utilisateur "antoni4040". Lorsque j'essaie de migrer sans le champ par défaut, il demande une valeur par défaut, donc je ne peux pas m'en tirer. Mais voici ce que je reçois lors de l'exécution makemigrations:

Migrations for 'jokes_app': 
    0008_joke_creator.py: 
    - Add field creator to joke 
Traceback (most recent call last): 
    File "./manage.py", line 10, in <module> 
    execute_from_command_line(sys.argv) 
    File "/home/antoni4040/Documents/Jokes_Website/django-jokes/venv/lib/python3.4/site-packages/django/core/management/__init__.py", line 353, in execute_from_command_line 
    utility.execute() 
    File "/home/antoni4040/Documents/Jokes_Website/django-jokes/venv/lib/python3.4/site-packages/django/core/management/__init__.py", line 345, in execute 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
    File "/home/antoni4040/Documents/Jokes_Website/django-jokes/venv/lib/python3.4/site-packages/django/core/management/base.py", line 348, in run_from_argv 
    self.execute(*args, **cmd_options) 
    File "/home/antoni4040/Documents/Jokes_Website/django-jokes/venv/lib/python3.4/site-packages/django/core/management/base.py", line 399, in execute 
    output = self.handle(*args, **options) 
    File "/home/antoni4040/Documents/Jokes_Website/django-jokes/venv/lib/python3.4/site-packages/django/core/management/commands/makemigrations.py", line 150, in handle 
    self.write_migration_files(changes) 
    File "/home/antoni4040/Documents/Jokes_Website/django-jokes/venv/lib/python3.4/site-packages/django/core/management/commands/makemigrations.py", line 178, in write_migration_files 
    migration_string = writer.as_string() 
    File "/home/antoni4040/Documents/Jokes_Website/django-jokes/venv/lib/python3.4/site-packages/django/db/migrations/writer.py", line 167, in as_string 
    operation_string, operation_imports = OperationWriter(operation).serialize() 
    File "/home/antoni4040/Documents/Jokes_Website/django-jokes/venv/lib/python3.4/site-packages/django/db/migrations/writer.py", line 124, in serialize 
    _write(arg_name, arg_value) 
    File "/home/antoni4040/Documents/Jokes_Website/django-jokes/venv/lib/python3.4/site-packages/django/db/migrations/writer.py", line 88, in _write 
    arg_string, arg_imports = MigrationWriter.serialize(_arg_value) 
    File "/home/antoni4040/Documents/Jokes_Website/django-jokes/venv/lib/python3.4/site-packages/django/db/migrations/writer.py", line 433, in serialize 
    return cls.serialize_deconstructed(path, args, kwargs) 
    File "/home/antoni4040/Documents/Jokes_Website/django-jokes/venv/lib/python3.4/site-packages/django/db/migrations/writer.py", line 318, in serialize_deconstructed 
    arg_string, arg_imports = cls.serialize(arg) 
    File "/home/antoni4040/Documents/Jokes_Website/django-jokes/venv/lib/python3.4/site-packages/django/db/migrations/writer.py", line 517, in serialize 
    item_string, item_imports = cls.serialize(item) 
    File "/home/antoni4040/Documents/Jokes_Website/django-jokes/venv/lib/python3.4/site-packages/django/db/migrations/writer.py", line 540, in serialize 
    "topics/migrations/#migration-serializing" % (value, get_docs_version()) 
ValueError: Cannot serialize: <User: antoni4040> 
There are some values Django cannot serialize into migration files. 
For more, see https://docs.djangoproject.com/en/1.9/topics/migrations/#migration-serializing 

Qu'est-ce que je fais mal?

Répondre

1

Vous utilisez le jeu de requête User.objects.filter(username="antoni4040"). Pour obtenir une instance de modèle, vous devez utiliser User.objects.get(username="antoni4040"). Toutefois, vous ne devez pas utiliser une instance de modèle comme valeur par défaut dans le champ du modèle. Il n'y a pas de gestion des erreurs si l'utilisateur n'existe pas dans la base de données. En fait, si models.py est chargé avant d'exécuter les migrations initiales, la table User n'existe même pas et la requête génère une erreur.

La logique pour définir l'utilisateur par défaut devrait aller dans la vue (ou l'administrateur Django) au lieu du fichier de modèles.

Dans l'admin, vous pouvez définir un formulaire personnalisé qui définit la valeur initiale pour le champ creator.

class MyModelForm(forms.ModelForm): 
    class Meta: 
     model = MyModel 

    def __init__(self, *args, **kwargs): 
     try: 
      user = User.objects.get(username="antoni4040") 
      kwargs['initial']['creator'] = user 
     except MyModel.DoesNotExist: 
      pass 
     super(MyModelForm, self).__init__(*args, **kwargs) 

Ensuite, utilisez ce formulaire modèle dans votre admin.

class MyModelAdmin(admin.ModelAdmin): 
    form = MyModelForm 
    ... 
+0

Pourriez-vous préciser ce que vous voulez dire? – Antoni4040

+0

Je viens d'ajouter "null = True" et supprimé le champ par défaut, semble fonctionner, mais maintenant je dois définir manuellement l'administrateur ... – Antoni4040

+0

Je n'ai pas élaboré auparavant parce que vous n'aviez même pas dit si oui ou non vous êtes en utilisant l'admin. Il est plus difficile de répondre parce que vous n'avez pas montré beaucoup de code. J'ai ajouté un exemple maintenant. – Alasdair