(с использованием Django 1.11)
Этот вопрос стал запутанным, потому что сообщаемое поведение не является современным поведением для смежной области. Пример здесь, где JobTemplate
- это класс модели, а credentials
- это поле, связанное со многими ко многим:
>>> JobTemplate._meta.get_field('credentials').__class__
django.db.models.fields.related.ManyToManyField
Отличается ли это, если мы проверяем _meta
объекта?
>>> JobTemplate.objects.first()._meta.get_field('credentials').__class__
django.db.models.fields.related.ManyToManyField
нет.
Так вот, когда я вставляю то, что я считаю наиболее вероятным сценарием прихода сюда кого-то. У вас есть это:
>>> JobTemplate.objects.first().credentials
<django.db.models.fields.related_descriptors.ManyRelatedManager at 0x6f9b390>
Обратите внимание, это то, что было у ОП.
Я оговорю, что связанной моделью является Credential
. Я могу проверить, связан ли это с диспетчером учетных данных!
>>> isinstance(JobTemplate.objects.first().credentials, Credential.objects.__class__)
True
Поля ManyToMany могут быть очень трудными для обработки, потому что атрибут убивает себя и заменяет себя подклассом менеджера. Вы также можете сопоставить эту информацию с полем, полученным из get_field('credentials')
, чтобы быть более уверенным. Вышеупомянутая проверка isinstance
может также ошибочно подобрать других менеджеров, которые вы установили в модели. Тем не менее, это все еще является ценным тестом, чтобы выяснить, «крякает» ли ваш атрибут «как» поле ManyToMany этой конкретной связанной модели.