Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.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
Django 尝试筛选帖子时出现属性错误_Django_Inheritance_Attributes_Views - Fatal编程技术网

Django 尝试筛选帖子时出现属性错误

Django 尝试筛选帖子时出现属性错误,django,inheritance,attributes,views,Django,Inheritance,Attributes,Views,我正在写一个基本的Django CMS(纯粹是为了我自己的编码练习)。作为其中的一部分,我有一个抽象的“可显示”类,我的Post和Comment类都扩展了该类: class Displayable(models.Model): text = models.TextField() created = models.DateTimeField(editable=False) modified = models.DateTimeField(editable=False)

我正在写一个基本的Django CMS(纯粹是为了我自己的编码练习)。作为其中的一部分,我有一个抽象的“可显示”类,我的Post和Comment类都扩展了该类:

class Displayable(models.Model):
    text = models.TextField()
    created = models.DateTimeField(editable=False)
    modified = models.DateTimeField(editable=False)

    class Meta:
        abstract = True

class Post(Displayable):
    title = models.CharField(max_length=128)
    author = models.ForeignKey(User)
视图代码如下所示,“年”是参数化URL中的四位数字(例如“2014”)

当我试图访问开发服务器上的此类页面(例如/blog/2010/)时,我得到一个AttributeError:

类型对象“Post”没有属性“created”


问题是,至少就我所了解的Django中继承是如何工作的,“Post”确实(或至少应该)有一个属性“created”。我正在使用的IDE(安装了Python模块的IDEA)很高兴有这样一个属性(它甚至在自动完成中出现),所以我无法理解Django开发服务器为什么说没有。

您应该阅读上的文档。要筛选的方式如下所示:

posts = Post.objects.filter(created__year=year)
Django ORM自动将这些关键字参数转换为数据库中的正确查找

至于为什么
Post
类没有创建的属性
:Django模型是相当复杂的类。第一次导入它们时,a将创建您使用的实际类,该类是根据您编写的类定义创建的。部分原因是删除类定义中定义的所有
字段
子类,将其添加到
\u meta.fields
属性中,并将原始属性设置为字段描述的实际值

这意味着这些字段在类本身上不再可用。如果一个字段属于超类,您将得到您看到的错误,但是如果它属于
Post
类,您仍然会得到
AttributeError:“created”属性只能从Post实例访问。这样Django就可以防止您将字段值设置/获取为类属性

posts = Post.objects.filter(created__year=year)