python - Django 模型继承和字段上的 hasattr()

标签 python django django-models

我正在为这个问题苦苦挣扎。假设我的模型位于以下 testapp 应用 models.py 文件中:

from django.db import models

class Parent(models.Model):
    my_attribute = models.BooleanField(default=False)

    class Meta:
        abstract = True

class Child(Parent):
    child_stuff = models.CharField(max_length=255, blank=True)

现在,如果我尝试这个(例如在控制台中)

(交互式控制台)

from testapp.models import Child

hasattr(Child, 'my_attribute')

错误

c = Child()

hasattr(c, 'my_attribute')

正确

这对我来说真的很奇怪(因为Parent是抽象的)。如何检查Child的字段?我期待第一个 hasattr 返回 True 。我应该尝试通过 _meta 按名称获取字段并检查它是否返回字段吗?对于一个简单的需求来说似乎很棘手......

干杯!

最佳答案

Django 1.8 有一个记录的 _meta API。

您可以使用get_fields ,

my_attribute in [field.name for field in Child._meta.get_fields()]

请注意,get_fields 有一个 include_parents 选项,您可以使用包含或排除父模型中的字段。

或者您可以使用get_field ,并捕获 FieldDoesNotExist 异常。

from django.db.models import FieldDoesNotExist

try:
    field = Child._meta.get_field('my_attribute')
except FieldDoesNotExist:
    # field does not exist
    pass

关于python - Django 模型继承和字段上的 hasattr(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32250074/

相关文章:

python - Pandas 汇总平均值,同时排除当前行

python - 更改 DateTimeIndex 的日期

c++ - 提取基类指针

javascript - 表单输入onload替代

Django测试组织题

django - 定义 django 模型关系

python - 使用 API 而不是数据库的 Django 模型

python - 来自另一个模型实例的 Django 模型选择字段

python - 处理大文件的最佳 Python Zip 模块是什么?

python - 我收到 __init__() 与 CreateView 获得意外的关键字参数 'instance'