Любая подсказка об этой ошибке с родственным отношением, используя Django Orm?
Это весело:-)
Работая с EAV, мы внедряем общий обработчик отношений во время выполнения в модели.
model_cls
любой класс, а EavValue
класс имеет общее отношение, указывающее на это. Работает нормально с EavValues
к model_cls
Но, с другой стороны, нам нужно добавить метод доступа, чтобы упростить процесс:
generic_relation = generic.GenericRelation(EavValue,
object_id_field='entity_id',
content_type_field='entity_ct',
related_name=model_cls.__name__)
generic_relation.contribute_to_class(model_cls, 'eav_values')
Опять же, мы делаем это во время выполнения, потому что мы хотим, чтобы он работал с неприкасаемыми сторонними библиотеками.
Во время тестирования с Patient
класс как model_cls
мы получаем следующую ошибку:
eav_ng.patient: Accessor for m2m field 'eav_values' clashes with related m2m field 'EavValue.Patient'. Add a related_name argument to the definition for 'eav_values'.
Теперь мы подумали, что проще всего изменить второй параметр contribute_to_class
или же related_name
в GenericRelation
, но это не так! Мы получаем точно такую же ошибку, только с другим именем.
Вторая странная вещь: выполнение тех же тестов юнитов с Sqlite вместо MySql: все проходит.
Более того, независимо от порядка или тестов, мы всегда получаем эту ошибку на вторых тестах. Поскольку этот процесс происходит в register
метод и что мы называем register
а также unregister
на настройку и снести, я думаю, наши unregister
метод несовершенен.
Последний странный факт: мы получаем ошибку при запуске unittest, но мы не можем воспроизвести ее вручную. Хуже того, на моем коллегном компьютере ошибка не возникает, когда мы используем одну и ту же версию Python, Django, Ubuntu и MySQL.
Мы решили много трудных, но мы немного застряли на этом, поэтому любая подсказка приветствуется.
ОБНОВИТЬ:
Новые подсказки для этой замечательной игры:
Ошибки вызываются из этого фрагмента в django.core.management.validation, строка 245 (django 1.2.1):
for r in rel_opts.get_all_related_many_to_many_objects():
if r.field is not f:
if r.get_accessor_name() == rel_name:
e.add(opts, "Accessor for m2m field '%s' clashes with related m2m field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.get_accessor_name(), f.name))
if r.get_accessor_name() == rel_query_name:
e.add(opts, "Reverse query name for m2m field '%s' clashes with related m2m field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.get_accessor_name(), f.name))
Для нас r.get_accessor_name() == rel_name
Правда, так как оба "Пациент".
ОБНОВЛЕНИЕ 2:
Когда мы добавляем приложение, которое register
модель. Любая модель, проблема больше не появляется. Так много для unregister
теория...
Мы на две симметричные ошибки (обе стороны отношения). Удаление related_name
подавить одну из ошибок 0_о
1 ответ
Нашел решение
Добавление родового отношения для размещения ссылки в классе модели _meta.local_many_to_many
атрибут, который является списком. Джанго проверяет это, но не дает возможности избавиться от него. Исправить это:
# remove remaining reference to the generic relation
for field in model_cls._meta.local_many_to_many:
if field.name == 'eav_value': # your related name
model_cls._meta.local_many_to_many.remove(field)
break