如何获取多对多字段的related_name?

如何获取多对多字段的related_name?

问题描述:

我正在尝试获取多对多字段的related_name。在M2M场位于betweeen模型“集团”和“经幢”,并在组模型定义如下:如何获取多对多字段的related_name?

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-instance来访问该字段。所以这是通过lection.group_set

但我需要动态访问它,所以需要从某处获取related_name属性。

文档中Here,还有一个要注意的是可以访问ManyToManyField.related_name,但这并不为我不知为什么...

帮助将大量的赞赏工作。 在此先感谢。

编辑: 是否需要将类放在所有模型之上,它指定了related_name属性,因此每个模型都有一个类似的名称?像这里也许? - > docs.djangoproject.com/en/dev/topics/db/models/#be-careful-with-related-name

我已经在过去使用object.yourmanagerclass.join_table,但请注意,这将返回一个带引号的字符串

+0

请你给出一个实际的例子来呢?我的字段没有管理员属性。 – amann 2010-05-18 09:37:48

尝试:

field.related_query_name() 
+0

输出是“组”。输出应该是“group_set” – amann 2010-05-18 09:36:30

+0

不,对于m2ms不一定 – 2010-05-18 10:11:10

+0

你是什么意思? 所有这一切背后的想法是,我需要复制一个反应的所有关系到一个组,到另一个反应 - 实例..但是这应该适合所有其他对象,因此必须阅读related_name。 – amann 2010-05-18 13:03:49

你贴什么基本上是:

>>> f = models.ManyToManyField(...) 
>>> dir(f) 
(...) 

你可能需要什么,是让含有该领域中的实际模型类:

class MyModel(models.Model): 
    my_field = models.ManyToManyField(..., related_name='some_related_name') 

- 然后你可以这样做:

+0

感谢你的答案。 函数“related_query_name”的访问方式如下:'MyModel._meta.get_field_by_name('my_field')[0] .field.related_query_name()',但输出仍然是“group”,这是链接表。但是, (自动命名)相关的查询名称是“group_set”..你有什么想法吗? – amann 2010-06-14 11:25:52

+0

@amann'fs._meta.get_field_by_name('group')[0] .get_accessor_name()'将返回'group_set'。但是,你不知道Django什么时候会改变这个API,所以'%_set'.format('group')可以更明智,如果你没有改变相关的名字。 – 2014-01-31 16:16:34