5

如何檢查django中多對多字段的類型?如何在django中檢查多對多字段的類型?

我想做的事是這樣:

import django 
field.__class__ == django.db.models.fields.related.ManyRelatedManager 

這是不行的,因爲類ManyRelatedManager無法找到。 但是,如果我做field.__class__輸出是django.db.models.fields.related.ManyRelatedManager

爲什麼它指的是一個似乎不存在的類,我如何使它起作用?

非常感謝您的幫助。

回答

5

如果你已經有外地比如,你可以簡單地做:

if isinstance(field, ManyToManyField): 
    pass // stuff 

如果你只有相關的管理者來說,您可以反向查找的字段實例:

>>> print fm 
<class 'django.db.models.fields.related.ManyRelatedManager'> 
>>> print fm.instance._meta.get_field_by_name('fieldnamehere') 
(<django.db.models.fields.related.ForeignKey: fieldnamehere>, None, True, False) 

這隻在Django 1.5上進行了測試

+0

這將是最完美的方式,但我不知道如何獲得多對多字段的字段實例,該字段位於目標模型中..如果您可以幫助我, 'll會加密你的答案:) – amann 2010-05-17 14:17:02

+1

我可以用'object._meta.get_all_field_names()'列出所有的字段,但相應的字段名不能通過'object._meta.get_field('fieldname')'訪問。我可以使用''object._meta.get_field_by_name('fieldname')''來輸出'(,None,False,True)''。其實我不知道如何得到這個字段實例.. – amann 2010-05-17 14:22:18

+1

明白了:)它是: 'object._meta.get_field_by_name(「fieldname」)[0] .field' – amann 2010-05-17 14:27:06

12

您應該可以將其作爲字符串進行檢查。

field.__class__.__name__ == 'ManyRelatedManager' 
+1

感謝您的快速響應!但是,這不是一點點不活潑嗎?其實,我不認爲「ManyRelatedManager」這個類會重新命名,但這不是一點點馬虎麼?但是,我想我會使用這個答案,因爲它比lazerscience更高效。謝謝! – amann 2010-05-17 13:35:18

0

我不太清楚你想達到什麼樣的,但我想你最好看看你的模型_meta屬性確定Field類! 結帳_meta.fields_meta.many_to_many

你可以這樣做:

field_class = [f for f in yourmodel._meta.many_to_many if f.name=='yourfield'][0].__class__ 
0

(使用Django 1.11)

這個問題已經變得令人困惑,因爲報告的行爲不是相關領域的現代行爲。例如這裏,這裏JobTemplate是模型類,並credentials是多到許多相關領域:

>>> JobTemplate._meta.get_field('credentials').__class__ 
django.db.models.fields.related.ManyToManyField 

它是不同的,如果我們考察對象的_meta

>>> JobTemplate.objects.first()._meta.get_field('credentials').__class__ 
django.db.models.fields.related.ManyToManyField 

沒有。

因此,當我插入我認爲是最有可能來到這裏的人的場景時。你有這個:

>>> JobTemplate.objects.first().credentials 
<django.db.models.fields.related_descriptors.ManyRelatedManager at 0x6f9b390> 

請注意,這是OP有。

我會規定相關型號是Credential。我可以檢查這是否是相關的憑證經理!

>>> isinstance(JobTemplate.objects.first().credentials, Credential.objects.__class__) 
True 

多對多字段可以是非常困難的過程中,由於屬性會殺死自己,並與經理子類替換其本身。您也可以將此信息與從get_field('credentials')獲得的字段進行交叉引用,以確保其安全。以上isinstance支票也可能會錯誤地選取您在模型上設置的其他經理。然而,這仍然是一個有價值的測試,看看您是否「嘎嘎」了該特定相關模型的ManyToMany字段的屬性。

相關問題