5

多対多フィールドの related_name を取得しようとしています。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 属性をどこかから取得する必要があります。

ここのドキュメントには、 にアクセスできるという注記がありますManyToManyField.related_nameが、これは私の場合は何とか機能しません..

助けていただければ幸いです。前もって感謝します。

編集:すべてのモデルの上にクラスを配置する必要がありますか?これは related_name 属性を指定するため、すべてのモデルは同様の名前を持ちますか? もしかしてここみたい?-> docs.djangoproject.com/en/dev/topics/db/models/#be-careful-with-related-name

4

3 に答える 3

6

試す:

field.related_query_name()
于 2010-05-17T19:38:35.053 に答える
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'
于 2010-05-26T08:25:45.377 に答える
0

過去に使用object.yourmanagerclass.join_tableしたことがありますが、これは引用符で囲まれた文字列を返すことに注意してください

于 2010-05-17T16:21:52.510 に答える