检查 Django 中是否存在模型字段

新手上路,请多包涵

这是我在 models.py 中提出的解决方案:

 from django.db import models

@classmethod
def model_field_exists(cls, field):
    try:
        cls._meta.get_field(field)
        return True
    except models.FieldDoesNotExist:
        return False

models.Model.field_exists = model_field_exists

并像这样使用它:

 Post.field_exists('title') # > True or False

问题来自外键,我的 Post 模型属于一个类别,此检查有效:

 Post.field_exists('category') # > True

但是这个没有:

 Post.field_exists('category_id') # > False

这是 db 中的实际字段名称,我需要像这样检查它。我怎样才能在 Django 中做到这一点?

原文由 lucaswxp 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 772
1 个回答

hasattr(cls,field) 并非在所有情况下都有效,例如使用 mixins 的情况。一个安全的测试是:

             try:
                model._meta.get_field(field)
                .. do stuff here
            except FieldDoesNotExist:
                pass

或者

            field = None
            try:
                field = model._meta.get_field(field)
            except FieldDoesNotExist:
                pass

            if field:
              .. do stuff here

原文由 PhoebeB 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题