2011-07-04 39 views
2

我想实现类似Facebook的未读项目/通知。我目前有以下模型:django实现未读项目

class UnreadItems(models.Model): 
    unread = models.BooleanField() 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    user = models.ForeignKey(User,null=True) 
    content_object = generic.GenericForeignKey('content_type','object_id') 

    class Meta: 
     db_table = 'unread_items' 

每当有人产生任何别人,我创建了收件人为目标的新条目交谈/消息或。但是,创建未读很容易,但我应该如何以可管理的方式进行操作,以便在请求/查看资源时将项目标记为已读。

回答

1

一个选择是使用信号。

创建自定义信号[设置提供argurments要在项目访问]

创建注册到该信号的信号处理程序。在那个信号手柄访问对应于该项目的UnreadItem。

访问与UnreadItem链接的项目(在相应的视图方法中)时,将触发该信号。

该方案可让您在中央信号处理程序中隔离处理未读方面的逻辑。

我认为你选择这个设计的原因是因为你有多个项目类型可以被视为未读。通过这个方案,你不必传播处理未读的逻辑。所有观点需要知道的是触发信号。

+0

听起来合乎逻辑。但有时候,如果我只想计算未读项目,我不想将其设置为未读。与使用自定义管理器相比,它可以为信号完成吗? – goh

+0

请解释一下“计算未读项目”的含义?如果您想要问您是否要计算给定用户的未读项目数,则可以执行类似UnreadItems.objects.filter(user = u).count()的转发查询。您还可以通过content_type if您正在尝试为用户查找给定类型的未读项目。使用content_types框架查找给定模型的类型,然后在筛选器查询中使用。 – arustgi

+0

切记:信号对于操纵对象(CRUD)很有用。如果你只是想查询计数,你可以在视图中做到这一点 – arustgi

0

您可能需要在查看对象时在视图中执行此操作,也可以创建一个自定义管理器,在查询对象时将其自动标记为已读。