[英]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.