2016-07-22 6 views
0

У меня есть модель, и я хочу добавить OneToOneField держать создатель объекта: models.pyДжанго: модель OneToOneField с пользователем не может добавить значения по умолчанию

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

У меня уже есть база данных с элементами и просто хотите, чтобы значение по умолчанию было пользователем admin, у которого есть имя пользователя antoni4040. Когда я пытаюсь выполнить миграцию без поля по умолчанию, он запрашивает значение по умолчанию, поэтому я не могу с ним справиться. Но вот что я получаю при работе с махинациями:

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