簡體   English   中英

Django線程評論系統

[英]Django Threaded Commenting System

(對不起我的英語)

我正在學習Python和Django。 現在,我的挑戰是開發線程化通用注釋系統。 有兩種模型,“發布”和“評論”。

-帖子可以發表評論。

-評論可以評論。 (環形/螺紋)

-不應是系統中的n + 1查詢問題。 (無論有多少評論,都不應增加查詢數量)

我當前的模型是這樣的:

class Post(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()

    child = generic.GenericRelation(
        'Comment',
        content_type_field='parent_content_type',
        object_id_field='parent_object_id'
    )

class Comment(models.Model):
    content = models.TextField()

    child = generic.GenericRelation(
        'self',
        content_type_field='parent_content_type',
        object_id_field='parent_object_id'
    )

    parent_content_type = models.ForeignKey(ContentType)
    parent_object_id = models.PositiveIntegerField()
    parent = generic.GenericForeignKey(
        "parent_content_type", "parent_object_id")

我的模特對嗎? 而且我如何才能獲得帖子的所有注釋(帶有層次結構),而不會出現n + 1個查詢問題?

注意:我知道mttp和其他模塊,但是我想學習這個系統。


編輯:我運行“ Post.objects.all().prefetch_related("child").get(pk=1) ”命令,這給了我帖子及其子注釋。 但是,當我想獲取子命令的子命令時,新查詢正在運行。 我可以將命令更改為...prefetch_related("child__child__child...")...然后仍然針對子-父子關系的每個深度運行一個新查詢。 有誰有解決此問題的想法嗎?

如果您希望通過單個查詢獲取帖子的所有評論,那么最好將每個評論鏈接到相關的帖子。 您可以使用單獨的鏈接來指示父注釋。

基本上:

class Post(models.Model):
    ...
    comments = models.ManyToManyField('Comment')
    # link to all comments, even children of comments

class Comment(models.Model):
    ...
    child_comments = models.ManyToManyField('Comment')
    # You may find it easier to organise these into a tree 
    # if you use a parent_comment ForeignKey. That way the
    # top level comments have no parent and can be easily spotted.

Post.objects.all().select_related('comments').get(pk=1)

由於使用中間表,因此創建該關聯的許多很多需要花費一些額外的工作 如果您想要一個純粹的一對多,那么您需要在Comment上使用ForeignKey ,但是僅限於prefetch_related而不是select_related ,這會涉及額外的數據庫命中。

這樣也更好,因為您沒有未類型化的外鍵引用(您的PostitiveIntegerField )。

然后,您需要將注釋排列成樹形結構,但這超出了您的問題范圍。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM