10

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

我想这样做:

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

这不起作用,因为ManyRelatedManager找不到该类。但如果我这样做field.__class__,输出是django.db.models.fields.related.ManyRelatedManager

为什么它指的是一个似乎不存在的类,我怎样才能让它发挥作用?

非常感谢您的帮助。

4

4 回答 4

18

您应该能够将其作为字符串进行检查。

field.__class__.__name__ == 'ManyRelatedManager'
于 2010-05-17T13:18:04.177 回答
6

如果您已经拥有字段实例,您可以简单地执行以下操作:

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 上测试过

于 2010-05-17T13:45:27.977 回答
1

(使用 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 字段应该如何。

于 2017-11-16T20:30:45.403 回答
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__
于 2010-05-17T13:20:13.800 回答