【问题标题】:How to display self-joined fields in Django?如何在 Django 中显示自连接字段?
【发布时间】:2020-12-21 00:54:37
【问题描述】:

我正在尝试为我正在构建的社交媒体式网络应用程序构建评论部分。我有一个使用 Django 存储 cmets 的数据表,并且想构建一个回复功能。这是我的模型:

class Comments(models.Model):

    id = models.AutoField(primary_key=True)
    text = models.TextField()
    author = models.CharField(max_length=50)
    creation_time = models.DateTimeField(auto_now_add=True)
    answer = models.ForeignKey(Answers, on_delete=models.CASCADE)
    replyto = models.ForeignKey('self', null=True, on_delete=models.CASCADE)

    def __str__(self):
        return self.author + ' commented: ' + self.text

基本上,每当有人回复之前的评论时,我都会将之前评论的 ID 存储在“replyto”字段中,我希望通过该 ID 将当前评论链接到之前的评论。在从我设置的视图中获取当前评论时,我想获取当前评论的所有字段(如上所述)以及先前评论的文本和作者(即正在回复的评论)。

在基本 SQL 中,我认为这将是一些自联接逻辑。如何在 Django 中执行此操作(并显示上述被回复评论的附加文本和作者字段)?谢谢!

【问题讨论】:

    标签: python sql django self-join


    【解决方案1】:

    这是我的解决方案,它不是有效的,但我不知道该怎么做

    class Comment(models.Model):
    
        id = models.AutoField(primary_key=True)
        text = models.TextField()
        author = models.CharField(max_length=50)
        creation_time = models.DateTimeField(auto_now_add=True)
        # answer = models.ForeignKey(Answers, on_delete=models.CASCADE)
        parent = models.ForeignKey('self', null=True, on_delete=models.CASCADE)
    
        def __str__(self):
            return self.author + ' commented: ' + self.text
    
        def __init__(self, *args, **kwargs):
            super(Comment, self).__init__(*args, **kwargs)
            self.child_comments_list = []
    
        @classmethod
        def update_all_child_comments_lists(cls):
            all_comments = cls.objects.all()
            for comment1 in all_comments:
                for comment2 in all_comments:
                    if comment1.id == comment2.parent_id:
                        comment1.child_comments_list.append(comment2)
            return all_comments
    

    所以从update_all_child_comments_lists 返回的all_comments 将返回每个带有属性child_comments_list 的评论,其中包含所有子cmets 的列表

    【讨论】:

      猜你喜欢
      • 2010-10-28
      • 1970-01-01
      • 2022-01-01
      • 1970-01-01
      • 2020-05-09
      • 2023-01-03
      • 1970-01-01
      • 2021-05-25
      • 1970-01-01
      相关资源
      最近更新 更多