【问题标题】:How to get the related_name of a many-to-many-field?如何获取多对多字段的related_name?
【发布时间】:2011-02-20 11:28:45
【问题描述】:

我正在尝试获取多对多字段的相关名称。 m2m-field 位于模型“Group”和“Lection”之间,在 group-model 中定义如下:

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

【问题讨论】:

    标签: python django django-models many-to-many m2m


    【解决方案1】:

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

    【讨论】:

    • 你能举个实际的例子吗?我的字段没有经理属性..
    【解决方案2】:

    试试:

    field.related_query_name()
    

    【讨论】:

    • 输出是“group”..输出应该是“group_set”
    • 你是什么意思?这一切背后的想法是,我需要将一个lection的所有关系复制到一个组,另一个lection-instance..但这应该适合所有其他对象,因此必须读取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'
    

    【讨论】:

    • 感谢您的回答。函数“related_query_name”可按如下方式访问:'MyModel._meta.get_field_by_name('my_field')[0].field.related_query_name()' 但输出仍然是“组”,即链接表。但是(自动命名)相关查询名称是“group_set”..您对此有什么想法吗?
    • @amann fs._meta.get_field_by_name('group')[0].get_accessor_name() 将返回 group_set。但是您不知道 Django 何时会更改该 API,因此如果您不更改相关名称,则 '%_set'.format('group') 可能更明智。
    猜你喜欢
    • 2013-09-14
    • 2017-12-12
    • 2015-01-24
    • 1970-01-01
    • 1970-01-01
    • 2019-09-18
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    相关资源
    最近更新 更多