Это забавно: -)
Работая с EAV, мы внедряем универсальный обработчик отношений во время выполнения в модели.
model_cls
- любой класс, а *Класс 1006 * имеет общее отношение, указывающее на него.Он отлично работает от 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, on line 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
... 1056
Мы с двумя симметричными ошибками (обе стороны отношения).Удаление related_name
подавление одной из ошибок 0_o