【问题标题】:How to check the type of a many-to-many-field in django?如何在 django 中检查多对多字段的类型?
【发布时间】:2010-05-17 12:47:44
【问题描述】:

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

我想这样做:

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

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

为什么它引用一个似乎不存在的类,我怎样才能让它工作?

非常感谢您的帮助。

【问题讨论】:

    标签: python django django-models manytomanyfield manyrelatedmanager


    【解决方案1】:

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

    field.__class__.__name__ == 'ManyRelatedManager'
    

    【讨论】:

    • 感谢您的快速回复!但这不是有点不动态吗?实际上,我不认为“ManyRelatedManager”这个类会被重命名,但是是不是有点草率?但是,我想我会使用这个答案,因为它比 lazerscience 的更高效。谢谢!
    【解决方案2】:

    如果您已经拥有字段实例,您可以这样做:

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

    【讨论】:

    • 这将是完美的方式,但我不知道如何获取位于目标模型中的多对多字段的字段实例。如果您可以帮我解决这个问题,我会接受你的回答:)
    • 我可以使用object._meta.get_all_field_names() 列出所有字段,但无法通过object._meta.get_field('fieldname') 访问相应的字段名。我可以使用函数object._meta.get_field_by_name('fieldname') 输出(&lt;RelatedObject: projectname:modelname1 related to modelname2&gt;, None, False, True)。实际上我不知道如何从中获取字段实例..
    • 知道了 :).. 它是:object._meta.get_field_by_name("fieldname")[0].field
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      我不太确定您要实现什么,但我想您最好查看模型的 _meta 属性以确定字段类! 查看_meta.fields_meta.many_to_many

      你可以这样做:

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

      【讨论】:

        猜你喜欢
        • 2013-05-17
        • 2021-12-22
        • 1970-01-01
        • 1970-01-01
        • 2011-05-19
        • 2015-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多