如何检查django中多对多字段的类型?

时间:2010-05-17 12:47:45

标签: python django django-models manytomanyfield manyrelatedmanager

如何检查django中多对多字段的类型?

我想这样做:

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

这不起作用,因为无法找到类ManyRelatedManager。 但如果我field.__class__,则输出为django.db.models.fields.related.ManyRelatedManager

为什么它会引用一个似乎不存在的类,我该如何将其用于工作?

非常感谢你的帮助。

4 个答案:

答案 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字段应该如何。