victor_usachev
@victor_usachev
Python Dev

Как правильно описать ManyToManyField в Django 1.10?

Добрый день, товарищи.

Есть проект на django 1.3 (python 2.7), который я успешно обновил до django 1.10 (python 3.4).
Проблема возникла только с двумя моделями, связанными как ManyToMany, другие подобные модели по-прежнему работают. Вероятно, я не учёл какие-то изменения в ORM. Код:

class Dataset(HistoryModel):
    """
    Класс для отчета по расходу ресурсов. Содержит редактируемую структуру полей.
    """

    name = models.CharField('Название набора данных', max_length=300)
    fields = models.ManyToManyField(DatasetField, verbose_name='Поля набора данных', db_table="data_proxy_fields")
    
    class Meta:
        verbose_name = 'Набор данных'
        ordering = ['name']
        db_table = "data_proxy"


class DatasetField(HistoryModel):
    """
    Поле набора данных.
    """
    name = models.CharField('Пользовательское название', max_length=300)
    model_content_type = models.ForeignKey(ContentType)
    index = models.IntegerField('Индекс поля', default=0)

    class Meta:
        verbose_name = "Поле набора данных"
        ordering = ['model_content_type__name', 'index']
        db_table = "dataset_field"


Где обнаружилась ошибка:
dataset = Dataset.objects.get(id=dataset_id)
return serializers.serialize("json", dataset.fields.all())


Traceback (most recent call last):
  File "/WORK/daily/project/project/dataset/views.py", line 451, in get_all_fields
    return serializers.serialize("json", dataset.fields.all())
  File "/WORK/envs/dj1.10/lib/python3.4/site-packages/django/core/serializers/__init__.py", line 129, in serialize
    s.serialize(queryset, **options)
  File "/WORK/envs/dj1.10/lib/python3.4/site-packages/django/core/serializers/base.py", line 79, in serialize
    for count, obj in enumerate(queryset, start=1):
  File "/WORK/envs/dj1.10/lib/python3.4/site-packages/django/db/models/query.py", line 256, in __iter__
    self._fetch_all()
  File "/WORK/envs/dj1.10/lib/python3.4/site-packages/django/db/models/query.py", line 1087, in _fetch_all
    self._result_cache = list(self.iterator())
  File "/WORK/envs/dj1.10/lib/python3.4/site-packages/django/db/models/query.py", line 54, in __iter__
    results = compiler.execute_sql()
  File "/WORK/envs/dj1.10/lib/python3.4/site-packages/django/db/models/sql/compiler.py", line 824, in execute_sql
    sql, params = self.as_sql()
  File "/WORK/envs/dj1.10/lib/python3.4/site-packages/django/db/models/sql/compiler.py", line 369, in as_sql
    extra_select, order_by, group_by = self.pre_sql_setup()
  File "/WORK/envs/dj1.10/lib/python3.4/site-packages/django/db/models/sql/compiler.py", line 47, in pre_sql_setup
    order_by = self.get_order_by()
  File "/WORK/envs/dj1.10/lib/python3.4/site-packages/django/db/models/sql/compiler.py", line 293, in get_order_by
    field, self.query.get_meta(), default_order=asc))
  File "/WORK/envs/dj1.10/lib/python3.4/site-packages/django/db/models/sql/compiler.py", line 553, in find_ordering_name
    field, targets, alias, joins, path, opts = self._setup_joins(pieces, opts, alias)
  File "/WORK/envs/dj1.10/lib/python3.4/site-packages/django/db/models/sql/compiler.py", line 586, in _setup_joins
    pieces, opts, alias)
  File "/WORK/envs/dj1.10/lib/python3.4/site-packages/django/db/models/sql/query.py", line 1402, in setup_joins
    names, opts, allow_many, fail_on_missing=True)
  File "/WORK/envs/dj1.10/lib/python3.4/site-packages/django/db/models/sql/query.py", line 1327, in names_to_path
    "Choices are: %s" % (name, ", ".join(available)))
django.core.exceptions.FieldError: Cannot resolve keyword 'name' into field. Choices are: app_label, datasetfield, id, logentry, model, permission

Я думаю, что что-то не так в коде самих моделей, но что именно - выяснить не удалось.
Пытался дебажить, но ухожу в глубины orm, вряд ли ошибка там.

Прошу помощи, поскольку уже 3 дня бьюсь над кодом и прочёсываю stackoverflow - безрезультатно.
  • Вопрос задан
  • 826 просмотров
Решения вопроса 1
victor_usachev
@victor_usachev Автор вопроса
Python Dev
Убил просто кучу времени из-за неинформативности лога и собственной невнимательности. Я искал проблему где только можно, но всё оказалось просто - указанное в ordering поле не существует:

class DatasetField(HistoryModel):
    # ...
    model_content_type = models.ForeignKey(ContentType)
    class Meta:
        # ...
        ordering = ['model_content_type__name', 'index']


В django.contrib.contenttypes.models.ContentType ранее было поле name, но его выпилили.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Bjornie
Изучаю Python
В ошибке в самом конце говорится, что не найдено поле в таблице. И спрашивает (предлагает) какие из этих полей могут быть правильными: app_label, datasetfield, id, logentry, model, permission
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы