2013-11-15 37 views
0

我需要生成一個用戶流。我在Django 1.5中使用內容類型框架,我正在使用第三方軟件包'Phileo(喜歡),Django-Posts(用於發佈),Dialogos(評論)在Django中創建活動流

我有一篇文章,評論,贊,沿着連接與事件數據庫模型

這裏是我的日誌模型看起來像

class Post(models.Model): 
     text = models.TextField(_("Text")) 
     .... # no GenericForeignKey 

這裏是我的評論型號

class Comment(models.Model): 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.IntegerField() 
    content_object = GenericForeignKey() 

    comment = models.TextField() 

這裏是我的UserEvent型號

class UserEvent(models.Model): 
    event = models.ForeignKey(Event) 
    data_type = models.ForeignKey(ContentType, null=True) 
    data_id = models.PositiveIntegerField(null=True) 
    data_object = generic.GenericForeignKey('data_type', 'data_id') 


class Event(models.Model): 
    eventId = models.CharField(max_length=100) 
    title = models.CharField(max_length=200, default="untitled") 

的UserEvent包含諸如用戶的所有活動(的loggedIn,loggedOut,註冊,創建信息,對信息發表評論,喜歡的訊息等)。

Q - 1 * 會有什麼到了它的創建活動流的最佳方式。 *

如果我這樣做feeds = UserEvents.object.all()和模板,我可以做..

{% for item in feeds%} 
    {% if item.data_type.name == 'post' %} 
     {{ item.data_object.text }} 
     <!-- Show post --> 
    {% endif %} 
    {% if item.data_type.name == 'connection' %} 
     <!-- Show User 3 and User 5 are now friend --> 
    {% endif %} 
{% endfor %} 

但問題是Post沒有外鍵Comments模型。

Q - 2那麼,我該如何顯示與帖子相關的評論。我真的不想使用'模板標籤'。另一個解決方法是,我把comments = generic.GenericRelation(Comment)放在郵政模型,但我想通用(我相信UserEvent有所有相關項目),因爲在將來我有更多的模型..像'共享','標籤','喜歡'等..我需要把所有通用關係放在我的POST中。

class Like(models.Model): 

    sender = models.ForeignKey(AUTH_USER_MODEL, related_name="liking") 

    receiver_content_type = models.ForeignKey(ContentType) 
    receiver_object_id = models.PositiveIntegerField() 
    receiver = generic.GenericForeignKey(
     ct_field="receiver_content_type", 
     fk_field="receiver_object_id" 
    ) 

回答

0

我的方法是在模型中完成所有操作。

class UserEvent(models.Model): 
    user = models.ForeignKey(User) 
    event = models.ForeignKey(Event) 
    data_type = models.ForeignKey(ContentType, null=True) 
    data_id = models.PositiveIntegerField(null=True) 
    data_object = generic.GenericForeignKey('data_type', 'data_id') 


    def record_event(self, event, obj): 

     UserEvent.objects.create(user=self, event=event, data_type=ContentType.objects.get_for_model(obj), data_id=obj.id) 

然後在其他型號的保存方法:我在用戶模式,如創建一個方法

def save(self, *args, **kwargs): 

    # only record on creating a new post 
    if not self.id: 
     self.user.record_event(self.user, event=<not sure where you event from>,) 

    super(Post, self).save(*args, **kwargs) 

這可以變得更加複雜與在活動日誌中的內容類型字段。 這種方法的好處之一是它使測試更容易,因爲您只需測試模型而不必測試視圖。

+0

好的..我保存UserEvent已經..問題是如何獲得它的評論,並保持它的通用..看到我的模板.. UserEvent正在爲我工​​作,但我不知道如何從中獲取數據它.. –

+0

UserEvent已經在錄製用戶的活動,如(loggedIn,loggedOut,SignUp,Create Post,Post on Post,Like a Post等)。你看到帖子有沒有外鍵的評論,喜歡等,所以如何包括他們,而查詢UserEvent? –

+0

這可能是你在第二季度引用的內容,但是你可以在Post中創建一個@property像def comments(self):從通用關係返回與這篇文章相關的評論列表..並且對文章等做同樣的事情?在某處,如何獲得每個評論的定義將不得不完成...... – PhoebeB

0

在django應用程序中創建模型之間關係的原因之一是幫助檢索具有查詢的模型的效率。

Q - 1會有什麼到了它的創建活動流的最佳方式。

UserEvent模型巧妙地封裝了您的應用程序的這種行爲。

顯示的代碼片段看起來相當不錯,也可以將條件移動到另一個模板中,這樣可以在網站的其他部分重新使用它。

喜歡的東西:

{% for item in feeds%} 
    {% include "display_feed.html" %} 
{% endfor %} 

display_feed.html:

{% if item.data_type.name == 'post' %} 
    {{ item.data_object.text }} 
    <!-- Show post --> 
{% endif %} 
{% if item.data_type.name == 'connection' %} 
    <!-- Show User 3 and User 5 are now friend --> 
{% endif %} 

Q-2但問題是,文章沒有外鍵的評論模型。

我不能完全肯定你的網站的結構,但我會建議創建ForeignKey其他方式從CommentPost

喜歡的東西:

class Comment(models.Model): 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.IntegerField() 
    content_object = GenericForeignKey() 
    post = models.ForeignKey(Post)   

    comment = models.TextField() 

這就允許特定職位的所有意見進行檢索,因爲他們是related-objects

post_comments = Post.comment_set.all() 

如果Comment對象可以是關於不僅僅是Posts ,那麼這可以變成一個通用的關係。

所有未來的模型'Share','Tag','Likes'等也可以具有相同的外鍵,並且可以以相同的方式訪問。這也適用於模板:

{% for item in post.comment_set.all %} 
    {% include "display_comment.html" %} 
{% end for %} 
{% for item in post.tag_set.all %} 
    {% include "display_tag.html" %} 
{% end for %} 

恕我直言UserEvent模型不涉及檢索意見的活動,以便不必在這裏使用。 這可能看起來像一個稍微簡單的答案,但通常在Django中,簡單的答案是最有效的,最快的實現和最好的;)。

+0

我還有其他模型,如文章,圖庫,圖片等..我在所有的ContentType中使用通用類似的東西..像'content_type ='Image'object_id ='image_id' ,content_type ='Video'object_id ='video_id''因此添加外鍵來發布是沒有意義的。 –

+0

我將'ForeignKey'添加到'Comment'_not_'Post'。 –

+0

我是否需要在我的'文章,圖庫,視頻'模型中將'ForeignKey'添加到'Comment'? –