如何检查django中多对多字段的类型?
我想这样做:
import django
field.__class__ == django.db.models.fields.related.ManyRelatedManager
这不起作用,因为无法找到类ManyRelatedManager
。
但如果我field.__class__
,则输出为django.db.models.fields.related.ManyRelatedManager
为什么它会引用一个似乎不存在的类,我该如何将其用于工作?
非常感谢你的帮助。
答案 0 :(得分:13)
您应该能够将其作为字符串进行检查。
field.__class__.__name__ == 'ManyRelatedManager'
答案 1 :(得分: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上测试
答案 2 :(得分:0)
我不太确定你想要达到的目标,但我猜你应该更好地研究你的模型的_meta
属性来确定田野类!
查看_meta.fields
和_meta.many_to_many
!
您可以执行以下操作:
field_class = [f for f in yourmodel._meta.many_to_many if f.name=='yourfield'][0].__class__
答案 3 :(得分: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
ManyToMany字段可能非常难以处理,因为该属性会自行杀死并用管理器子类替换它自己。您还可以将此信息与从get_field('credentials')
获得的字段进行交叉引用,以确保更加明确。上述isinstance
检查也可能错误地选择您在模型上设置的其他管理员。但是,这仍然是一个有价值的测试,以查看您是否“嘎嘎”该特定相关模型的ManyToMany字段应该如何。