python - Django:模型 OneToOneField 与用户无法添加默认值

标签 python django database-migration one-to-one

我有一个模型,我想添加一个 OneToOneField 来保存对象的创建者: 模型.py

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

我做错了什么?

最佳答案

您正在使用查询集User.objects.filter(username="antoni4040")。要获取模型实例,您可以使用 User.objects.get(username="antoni4040")

但是,您不应使用模型实例作为模型字段中的默认值。如果数据库中不存在该用户,则不会进行错误处理。事实上,如果在运行初始迁移之前加载 models.py,则 User 表甚至不存在,因此查询将给出错误。

设置默认用户的逻辑应该放在 View (或 Django 管理)中,而不是模型文件中。

在管理员中,您可以定义一个自定义表单来设置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
    ...

关于python - Django:模型 OneToOneField 与用户无法添加默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38531939/

相关文章:

python - Django 与 oauth2 用于 REST API

更新字符串中三个字符的 SQL 语句

database-migration - 类型ORM Cli : migrationsDir seems to be ignored by scripts

php - 在 Yii 迁移中添加外键

python - flask 不服务图片

python - 在Python中使用正则表达式从文件名中获取剧集编号

python - 将所有标准输出存储到文件中,同时仍将其显示在屏幕上

python - 如何调用 json 字典中列表中的值

python - Django form.save() 到另一个类/函数

python - 错误 R14(超出内存配额)在 New Relic 中不可见