这个模型在Django中是如何工作的?

时间:2014-03-14 22:30:26

标签: django django-models django-apps django-managers

我在此处找到了使用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'),
    )

1 个答案:

答案 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)