2016-07-22 31 views
0

我有一個模型,我想補充一個OneToOneField持有的對象的創建者: models.pyDjango的:模型用戶OneToOneField不能添加默認值

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

我已經有一個數據庫與項目,只是希望默認值是管理員用戶,其中有用戶名「antoni4040」。當我嘗試遷移沒有默認字段時,它會要求一個默認值,所以我不能逃避它。但這裏是我運行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 

我在做什麼錯?

回答

1

您正在使用查詢集User.objects.filter(username="antoni4040")。要獲得模型實例,您可以使用User.objects.get(username="antoni4040")

但是,不應將模型實例用作模型字段中的默認模型。如果用戶不在數據庫中,則沒有錯誤處理。事實上,如果在運行初始遷移之前加載了models.py,那麼User表將不存在,因此查詢將會出現錯誤。

設置默認用戶的邏輯應該放在視圖(或Django admin)中而不是模型文件中。

在管理員中,您可以定義一個自定義表單來設置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) 

然後在您的管理員中使用該模型表單。

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

你能詳細說一下你的意思嗎? – Antoni4040

+0

我剛剛添加了「null = True」,並刪除了默認字段,似乎工作,但現在我不得不手動設置管理... – Antoni4040

+0

我之前沒有詳細說明,因爲你甚至沒有說過你是否是使用管理員。這很難回答,因爲你沒有顯示太多的代碼。我現在添加了一個例子。 – Alasdair

相關問題