views:

216

answers:

3

I'm trying to get the related_name of a many-to-many-field. The m2m-field is located betweeen the models "Group" and "Lection" and is defined in the group-model as following:

lections = models.ManyToManyField(Lection, blank=True)

The field looks like this:

<django.db.models.fields.related.ManyToManyField object at 0x012AD690>

The print of field.__dict__ is:

 {'_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'}

Now the field should be accessed via a lection-instance. So this is done by lection.group_set

But i need to access it dynamically, so there is the need to get the related_name attribute from somewhere.

Here in the documentation, there is a note that it is possible to access ManyToManyField.related_name, but this doesn't work for my somehow..

Help would be a lot appreciated. Thanks in advance.

Edit: Is there a need to put a class above all my models, which specifies the related_name attribute and so, every model has a similar name? like here maybe? -> docs.djangoproject.com/en/dev/topics/db/models/#be-careful-with-related-name

I would love you if you could help me :)

A: 

I've used object.yourmanagerclass.join_table in the past, but note that this returns a quoted string

stevejalim
could you please give a practical example to this? My field doesn't have a manager-attribute..
amann
+1  A: 

Try:

field.related_query_name()
lazerscience
the output is "group".. the output should be "group_set"
amann
No, not necessarily for m2ms
stevejalim
how do you mean? the idea behind all this is, that i need to copy all the relations of a lection to a group, to another lection-instance.. but this should fit with every other object, therefore the related_name must be read..
amann
A: 

What you pasted is basically:

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

What you probably need, is to get an actual model class containing that field:

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

-- and then you can do:

>>> MyModel._meta.get_field_by_name('my_field')[0].related_query_name()
'some_related_name'
Tomasz Zielinski
Thanks for your answer.The function "related_query_name" is accessible as follows: 'MyModel._meta.get_field_by_name('my_field')[0].field.related_query_name()' but the output is still "group", which is the linked table.. But the (automatically named) related query name is "group_set".. Do you have any ideas on this?
amann