我在此处找到了使用Django
编写的blog post app代码:
我对这段代码的作用感到困惑:
请解释下面的CommentManager类做什么以及传递给它的参数如何分配给某些“任意键”。下面的object
课程中使用了相同的Comment
。
怎么用?
class CommentManager(models.Manager):
def comments_for_object(self, site_id, app_label, model, obj_id, comment_type='comment'):
''' Get a QuerySet of all public comments for the specified object. '''
kwargs = {
'site__id__exact': site_id,
'content_type__app_label__exact': app_label,
'content_type__model__exact': model,
'object_id__exact': obj_id,
'comment_type__exact': comment_type,
'is_public__exact': True,
}
return self.filter(**kwargs)
class Comment(models.Model):
''' Data model for both comments and trackbacks '''
objects = CommentManager()
content_type = models.ForeignKey(ContentType)
object_id = models.IntegerField(_('object ID'))
comment = models.TextField(_('comment'), max_length=3000)
submit_date = models.DateTimeField(_('date/time submitted'), auto_now_add=True)
is_public = models.BooleanField(_('is public'))
ip_address = models.IPAddressField(_('ip address'))
site = models.ForeignKey(Site)
typeChoices = (
('comment', 'Comment'),
('trackback', 'Trackback'),
)
答案 0 :(得分:0)
默认情况下,Django中的每个Model都有一个管理器。默认值是非常简单的 - 例如,当您编写Comment.objects.all()
时,它相当于“SELECT * FROM”。你也可以过滤,例如:Comment.objects.filter(is_public = True)
但是,您可以编写自己的管理器(在此示例中为CommentManager)以进行自定义查询。
这里将CommentManager分配给Comment:objects=CommentManager()
,它允许您执行以下请求:
Comment.objects.comments_for_object(params)
params是(site_id,app_label,model,obj_id,comment_type)。代码只是将这些参数映射到查询中。
请注意,您可以更改访问管理员的名称。你可以写:
obj_comments=CommentManager()
然后致电:
Comment.obj_comments.comments_for_object(params)