Python Django模型继承和字段上的hasattr()
我正在努力解决这个问题。假设我的模型位于以下Python Django模型继承和字段上的hasattr(),python,django,django-models,Python,Django,Django Models,我正在努力解决这个问题。假设我的模型位于以下testappappmodels.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.Char
testapp
appmodels.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导入子项
hasattr(孩子,“我的属性”)
假的
c=儿童()
hasattr(c,“我的属性”)
真的
这让我觉得很奇怪(因为Parent
是抽象的)。如何检查Child
的字段?我希望第一个hasattr返回True。我是否应该尝试通过\u meta
按名称获取字段并检查它是否返回字段?对于一个简单的需求来说,这似乎很棘手
干杯 Django 1.8有一个文档化的api
print "my_attribute" in [
field.name for field in
Child._meta.get_fields(include_parents=True, include_hidden=True)
]
你可以使用
请注意,get\u fields
有一个include\u parents
选项,您可以从父模型中使用include或exclude字段
或者您可以使用,并捕获FieldDoesNotExist
异常
from django.db.models import FieldDoesNotExist
try:
field = Child._meta.get_field('my_attribute')
except FieldDoesNotExist:
# field does not exist
pass
好吧,我同意,但有没有更好的方法来实现这一点?像has_场方法?hasattr()的行为相当令人费解,它看起来不像。现在我不确定您想要实现什么,但您甚至不需要检查字段是否存在;相反,您可以只捕获
属性错误
异常。我认为它应该是。\u meta.get\u fields()
,至少根据。也许您的意思是执行hasattr(Child(),'my\u attribute')
?callable本身与它的实例不同。是的,但是我想在没有类实例的情况下检查该属性。这不是很奇怪吗?类本身没有父类是抽象的字段?我对它了解得不够,但很明显。也许更多的是关于创建什么表,所以你不能依赖你的假设\u meta
确实是获取这些信息的首选方式,尤其是在Django 1.8之后。
from django.db.models import FieldDoesNotExist
try:
field = Child._meta.get_field('my_attribute')
except FieldDoesNotExist:
# field does not exist
pass