Любая подсказка об этой ошибке с родственным отношением, используя 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
Другие вопросы по тегам