尝试过滤帖子时出现属性错误

时间:2014-04-13 20:16:25

标签: 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)

    class Meta:
        abstract = True

class Post(Displayable):
    title = models.CharField(max_length=128)
    author = models.ForeignKey(User)

视图代码如下,其中'year'是参数化URL中的四位数字(例如'2014')。

from django.shortcuts import render
from django.http import HttpResponse
from django.template import RequestContext
from django.shortcuts import render_to_response
from blog.models import Post
def year_archive(request,year):
    context = RequestContext(request)
    context_dict = {'year':year}
    posts = Post.objects.filter(Post.created.year==year)
    # This will be a template call once I get the post filtering working!
    return HttpResponse("This is the archive view for the year"+year)

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

  

类型对象'发布'没有属性'已创建'

问题在于,至少据我所知,Django中的继承是如何工作的,“Post”确实(或者至少应该)具有“创建”属性。我正在使用的IDE(安装了Python模块的IDEA)非常高兴这样的属性存在(它甚至出现在自动完成中),所以我无法解释为什么Django开发服务器说它没有。 / p>

1 个答案:

答案 0 :(得分:0)

您应该阅读filters上的文档。您想要过滤的方式如下:

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

Django ORM会自动将这些关键字参数转换为数据库中的正确查找。

现在为什么Post类没有属性created:Django模型是非常复杂的类。第一次导入它们时,metaclass会创建您使用的实际类,它是根据您编写的类定义创建的。部分原因是,类定义中定义的所有Field子类都被删除,添加到_meta.fields属性,并且原始属性设置为字段描述的实际值。

这意味着这些字段在类本身上不再可用。如果一个字段属于一个超类,你会得到你看到的错误,但是如果它属于Post类,你仍然会得到AttributeError: the 'created' attribute can only be accessed from Post instances。这样Django就会阻止您将字段值设置/获取为类属性。