2011-07-04 47 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

您可能需要在查看對象時在視圖中執行此操作,也可以創建一個自定義管理器,在查詢對象時將其自動標記爲已讀。