Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django模型继承和字段上的hasattr()_Python_Django_Django Models - Fatal编程技术网

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
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导入子项

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