Как получить related_name поля "многие ко многим"?
Я пытаюсь получить related_name поля "многие ко многим". Поле m2m расположено между моделями "Группа" и "Лекция" и определяется в групповой модели следующим образом:
lections = models.ManyToManyField(Lection, blank=True)
Поле выглядит так:
<django.db.models.fields.related.ManyToManyField object at 0x012AD690>
Печать field.__dict__
является:
{'_choices': [],
'_m2m_column_cache': 'group_id',
'_m2m_name_cache': 'group',
'_m2m_reverse_column_cache': 'lection_id',
'_m2m_reverse_name_cache': 'lection',
'_unique': False,
'attname': 'lections',
'auto_created': False,
'blank': True,
'column': 'lections',
'creation_counter': 71,
'db_column': None,
'db_index': False,
'db_table': None,
'db_tablespace': '',
'default': <class django.db.models.fields.NOT_PROVIDED at 0x00FC8780>,
'editable': True,
'error_messages': {'blank': <django.utils.functional.__proxy__ object at 0x00FC
7B50>,
'invalid_choice': <django.utils.functional.__proxy__ object
at 0x00FC7A50>,
'null': <django.utils.functional.__proxy__ object at 0x00FC7
A70>},
'help_text': <django.utils.functional.__proxy__ object at 0x012AD6F0>,
'm2m_column_name': <function _curried at 0x012A88F0>,
'm2m_db_table': <function _curried at 0x012A8AF0>,
'm2m_field_name': <function _curried at 0x012A8970>,
'm2m_reverse_field_name': <function _curried at 0x012A89B0>,
'm2m_reverse_name': <function _curried at 0x012A8930>,
'max_length': None,
'name': 'lections',
'null': False,
'primary_key': False,
'rel': <django.db.models.fields.related.ManyToManyRel object at 0x012AD6B0>,
'related': <RelatedObject: mymodel:group related to lections>,
'related_query_name': <function _curried at 0x012A8670>,
'serialize': True,
'unique_for_date': None,
'unique_for_month': None,
'unique_for_year': None,
'validators': [],
'verbose_name': 'lections'}
Теперь к полю следует обращаться через экземпляр лекции. Так что это сделано lection.group_set
Но мне нужно получить к нему динамический доступ, поэтому нужно откуда-то получить атрибут related_name.
Здесь в документации есть примечание, что есть возможность доступа ManyToManyField.related_name
, но это не работает для меня как-то..
Помощь будет высоко ценится. Заранее спасибо.
Редактировать: есть ли необходимость поместить класс над всеми моими моделями, который определяет атрибут related_name, и поэтому каждая модель имеет похожее имя? как здесь может быть? -> docs.djangoproject.com/en/dev/topics/db/models/#be-careful-with-related-name
3 ответа
То, что вы вставили, в основном:
>>> f = models.ManyToManyField(...)
>>> dir(f)
(...)
Что вам, вероятно, нужно, так это получить реальный класс модели, содержащий это поле:
class MyModel(models.Model):
my_field = models.ManyToManyField(..., related_name='some_related_name')
- и тогда вы можете сделать:
>>> MyModel._meta.get_field_by_name('my_field')[0].related_query_name()
'some_related_name'
Я использовал object.yourmanagerclass.join_table
в прошлом, но обратите внимание, что это возвращает строку в кавычках