我正在编写一个基本的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>
答案 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就会阻止您将字段值设置/获取为类属性。