Реализация мантоманы в Django (вопрос администратора) - PullRequest
0 голосов
/ 25 августа 2018

Я потратил много времени на чтение других вопросов по этой теме и документации Django.Я относительно новичок в Python и совершенно новичок в django и веб-дизайне.

Я пытаюсь настроить сайт администратора, чтобы руководитель проекта, над которым я работаю, мог вводить / редактировать данные, которые онанеобходимо.Я пытаюсь реализовать множество отношений между двумя моделями: Подчиненная метафора и Миф.

models.py

class Mytheme(models.Model):
    myth_id = models.AutoField(primary_key=True)
    mytheme = models.CharField("Mytheme",max_length=1500, blank=True, null=True)
    superord_myth = models.CharField("Superordinate Myth", max_length=1500, blank=True, null=True)
    myth_dhuy = models.CharField("D'huy Myth",max_length=600, blank=True, null=True)
    deities_involved = models.CharField("Deities Involved",max_length=800, blank=True, null=True)
    myth = models.CharField("Myth",max_length=1000, blank=True, null=True)
    myth_comment = models.CharField("Comment",max_length=1500, blank=True, null=True)

    class Meta:
        managed = True
        db_table = 'mytheme'
        ordering = ['myth_id']
        verbose_name = 'Mytheme'

 class Subordinatemet(models.Model):

    submet_id = models.AutoField(primary_key=True)
    submetaphor = models.CharField("Subordinate Metaphor", max_length=1500, blank=True, null=True)
    sub_type = models.CharField("Type",max_length=200, blank=True, null=True)
    sub_semanticfield = models.CharField("Semantic Field",max_length=1500, blank=True, null=True) 
    sub_metanet_no = models.BigIntegerField("Metanet Number",blank=True, null=True)
    sub_metanet_frame = models.CharField("Metanet Frame",max_length=1500, blank=True, null=True)
    sub_dhuy_no = models.BigIntegerField("D'huy Number",blank=True, null=True)
    sub_dyson_ref = models.CharField("Dyson Reference",max_length=1500, blank=True, null=True)
    sub_johnlakoff_ref = models.CharField("Johnson/Lakoff Reference",max_length=1500, blank=True, null=True)
    sub_bibliography = models.CharField("Bibliography",max_length=2000, blank=True, null=True)
    sub_comment = models.CharField("Comment", max_length=2000, blank=True, null=True)
    ordinacy = models.SmallIntegerField("Ordinacy",blank=True, null=True)
    myths = models.ManyToManyField(Mytheme)

    class Meta:
        managed = True
        db_table = 'subordinatemet'
        ordering = ['submet_id']
        verbose_name = 'Subordinate Metaphor'

Когда я захожу на сайт администратора и пытаюсь добавить новую записьдля подчиненной метафоры я получаю сообщение об ошибке после нажатия кнопки сохранения:

The above exception was the direct cause of the following exception:
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/core/handlers/exception.py", line 35, in inner
    response = get_response(request)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/core/handlers/base.py", line 128, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/core/handlers/base.py", line 126, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/contrib/admin/options.py", line 575, in wrapper
    return self.admin_site.admin_view(view)(*args, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/utils/decorators.py", line 142, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/views/decorators/cache.py", line 44, in _wrapped_view_func
    response = view_func(request, *args, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/contrib/admin/sites.py", line 223, in inner
    return view(request, *args, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/contrib/admin/options.py", line 1554, in add_view
    return self.changeform_view(request, None, form_url, extra_context)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/utils/decorators.py", line 62, in _wrapper
    return bound_func(*args, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/utils/decorators.py", line 142, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/utils/decorators.py", line 58, in bound_func
    return func.__get__(self, type(self))(*args2, **kwargs2)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/contrib/admin/options.py", line 1451, in changeform_view
    return self._changeform_view(request, object_id, form_url, extra_context)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/contrib/admin/options.py", line 1492, in _changeform_view
    self.save_related(request, form, formsets, not add)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/contrib/admin/options.py", line 1049, in save_related
    form.save_m2m()
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/forms/models.py", line 439, in _save_m2m
    f.save_form_data(self.instance, cleaned_data[f.name])
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/models/fields/related.py", line 1619, in save_form_data
    getattr(instance, self.attname).set(data)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/models/fields/related_descriptors.py", line 955, in set
    old_ids = set(self.using(db).values_list(self.target_field.target_field.attname, flat=True))
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/models/query.py", line 272, in __iter__
    self._fetch_all()
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/models/query.py", line 1179, in _fetch_all
    self._result_cache = list(self._iterable_class(self))
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/models/query.py", line 178, in __iter__
    for row in compiler.results_iter(chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size):
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 1019, in results_iter
    results = self.execute_sql(MULTI, chunked_fetch=chunked_fetch, chunk_size=chunk_size)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 1068, in execute_sql
    cursor.execute(sql, params)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/backends/utils.py", line 100, in execute
    return super().execute(sql, params)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/backends/utils.py", line 68, in execute
    return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/backends/utils.py", line 77, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/backends/utils.py", line 85, in _execute
    return self.cursor.execute(sql, params)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/utils.py", line 89, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/backends/utils.py", line 85, in _execute
    return self.cursor.execute(sql, params)
django.db.utils.ProgrammingError: relation "subordinatemet_myths" does not exist
LINE 1: ...ECT "mytheme"."myth_id" FROM "mytheme" INNER JOIN "subordina...

Я вижу, что он пытается сделать, но, возможно, я не понимаю, что происходит за кулисами, достаточно, чтобы понять -почему- это пытается сделать это.

Мои вопросы:

  • Что здесь происходит - система создает «таблицу-призрак» отношений между двумя моделями?

  • Как это исправить, чтобы я мог использовать интерфейс администратора для добавления отношений между Subordinatemet и Mytheme?

Это мой первый пост, так что если кому-то понадобитсябольше информации, пожалуйста, скажите мне, и я отредактирую свой вопрос.

1 Ответ

0 голосов
/ 27 августа 2018

Django создает таблицу, в которой хранится отношение «многие ко многим»:

За кулисами Django создает промежуточную таблицу соединений для представляют отношение многие ко многим.

Сообщение об ошибке показывает, что таблицы там нет. Скорее всего, вы добавили поле в модель, но не распространили изменения в базе данных.

Для этого вам нужно:

  1. сначала сгенерировал необходимые миграции, используя команду django-admin makemigrations
  2. применить миграцию с помощью django-admin migrate command

Проверьте документацию для получения более подробной информации об использовании миграций.

...