2016-07-22 12 views
0

Ich habe ein Modell hinzufügen, und ich möchte ein OneToOneField hinzufügen, um den Schöpfer eines Objekts zu halten: models.pyDjango: Modell mit Benutzer OneToOneField nicht Standardwert

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

Ich habe bereits eine Datenbank mit Elementen und möchte nur den Standardwert als Admin-Benutzer, der den Benutzernamen "antoni4040" hat. Wenn ich versuche, ohne das Standardfeld zu migrieren, fragt es nach einem Standardwert, damit ich nicht damit durchkommen kann. Aber hier ist, was ich beim Ausführen von Makemigrationen bekomme:

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 

Was mache ich falsch?

Antwort

1

Sie verwenden das Abfrage-Set User.objects.filter(username="antoni4040"). Um eine Modellinstanz zu erhalten, verwenden Sie User.objects.get(username="antoni4040").

Sie sollten jedoch keine Modellinstanz als Standard im Modellfeld verwenden. Es gibt keine Fehlerbehandlung, wenn der Benutzer nicht in der Datenbank vorhanden ist. Wenn models.py geladen wird, bevor Sie die ersten Migrationen ausführen, wird die User-Tabelle sogar nicht vorhanden sein, so wird die Abfrage einen Fehler geben.

Die Logik zum Festlegen des Standardbenutzers sollte anstelle der Modelldatei in der Ansicht (oder Django admin) angezeigt werden.

Im Admin können Sie ein benutzerdefiniertes Formular definieren, das den Anfangswert für das Feld creator festlegt.

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) 

Dann dieses Modell Form in Ihrem Admin verwenden.

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

Können Sie näher erläutern, was Sie meinen? – Antoni4040

+0

Ich habe gerade "null = True" hinzugefügt und das Standardfeld gelöscht, scheint zu arbeiten, aber jetzt muss ich den Admin manuell einstellen ... – Antoni4040

+0

Ich habe nicht vorher ausgearbeitet, weil Sie nicht einmal gesagt hatten, ob oder nicht, ob Sie sind mit dem Admin. Es ist schwieriger zu beantworten, weil du nicht viel Code gezeigt hast. Ich habe jetzt ein Beispiel hinzugefügt. – Alasdair

Verwandte Themen