【问题标题】:"Object has no property _set" in DjangoDjango中的“对象没有属性_set”
【发布时间】:2022-01-17 05:44:48
【问题描述】:

无法弄清楚我的错误在哪里。无法映射以显示博客 cmets 列表。我正在使用 Django 并做出反应。从下面的代码中,我尝试使用外键使用 cmets 评估每篇博客文章。但我无法从博客中获取评论属性。如果我执行{blog.title} 之类的操作,我会在浏览器上重新获得博客的标题。由于 cmets 与每个帖子相关联,因此我尝试从博客对象中获取不同的评论属性(正如我在下面的代码中指定的那样),但我得到的值是 undefined。并拥有以下博文和博文评论模型:

class BlogComment(models.Model):
    post = models.ForeignKey(BlogPost, on_delete=models.SET_NULL, related_name="post_comment",  null=True)
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, related_name="user_comment", null=True)
    name = models.CharField(max_length=200, null=True, blank=True)
    comment = models.TextField(null=True, blank=True)
    dateCreated = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return str(self.user.username)

class BlogPost(models.Model):
    ...
    author = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, on_delete=models.CASCADE)
    body = models.TextField()
    dateCreated = models.DateTimeField(auto_now_add=True)

两个模型的序列化器是:

class CommentSerializer(serializers.ModelSerializer):
    class Meta:
        model = BlogComment
        fields = '__all__'

class BlogPostSerializer(serializers.ModelSerializer):
    comments = serializers.SerializerMethodField(read_only=True)
    class Meta:
        model = BlogPost
        fields = "__all__"

    def get_comments(self, obj):
        comments = obj.comment_set.all()
        serializer = CommentSerializer(comments, many=True)
        return serializer.data

评论的结尾是path('posts/<str:pk>/comment/', CreateCommentView, name="create-comment"),

端点正在工作。我可以从前端为帖子添加评论。当我尝试映射时出现错误 每个帖子的cmets。得到错误:AttributeError: 'BlogPost' object has no attribute 'comment_set'

这是我用来映射的代码,以在响应的博客详细信息页面中显示特定帖子的所有博客。我正在评估那里的每个博客:

<h2>{blog.title}</h2>
<img src={blog.image} />
<div variant='flush'>
                    {blog.comments.map((comment) => (
                        <div key={comment.id}>
                            <strong>{comment.name}</strong>            
                            <p>{comment.dateCreated}</p>
                            <p>{comment.comment}</p>
                        </div>
                    ))}
                </div>

这是我用来映射的代码,以在响应的博客详细信息页面中显示特定帖子的所有博客。如果我不映射错误不会出现,我可以添加评论。但是,为了在每篇博文下显示 cmets,我都会映射。我该如何解决这个问题?

【问题讨论】:

    标签: python reactjs python-3.x django django-rest-framework


    【解决方案1】:

    你需要使用post_comment:

    comments = obj.post_comment.all()
    

    你在这里声明了:

    post = models.ForeignKey(BlogPost, on_delete=models.SET_NULL, related_name="post_comment",  null=True)
    

    related_name 用作 Django 关系的名称。查看更多here

    但是将post_comment 换成其他东西对我来说会是一个更好的解决方案。

    【讨论】:

    • 谢谢@Yevgeniy Kosmak。进行更改后,错误不再出现。然而博客 cmets 没有显示在页面中。它现在显示的错误是它无法映射 undefined 的属性。
    • 我可以添加帖子,但是当我提交时,页面崩溃并变为空白,而不是显示在页面中的评论
    • @C-Bizz,我相信你应该为此提出一个新问题。我对 ReactJS 没有经验。现在你在前端本地化了这个问题,你可以用reactjs标签问它。
    • 好的,谢谢
    • @C-Bizz 很高兴为您提供帮助,祝您好运 :)
    猜你喜欢
    • 2016-03-30
    • 1970-01-01
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-11
    • 2015-02-19
    • 2021-04-05
    相关资源
    最近更新 更多