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

时间:2015-08-27 12:59:09

标签: python django django-models

我正在努力解决这个问题。假设我的模型位于以下testapp app 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)

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

(InteractiveConsole)

  

来自testapp.models导入Child

     

hasattr(Child,'my_attribute')

  

c = Child()

     

hasattr(c,'my_attribute')

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

干杯!

2 个答案:

答案 0 :(得分:2)

print "my_attribute" in  [
    field.name for field in 
    Child._meta.get_fields(include_parents=True, include_hidden=True)
]

答案 1 :(得分:2)

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