首页 > 解决方案 > Django Rest Framework:“RelatedManager”对象在使用嵌套序列化程序时没有属性“body”错误

问题描述

使用 Django DRF,我正在尝试使用嵌套序列化程序在博客中显示特定帖子的评论。

我遇到了以下错误:

'RelatedManager' object has no attribute 'body'

这是我的代码:

评论型号:

class Comment(models.Model):
    #adapted from https://blog.logrocket.com/use-django-rest-framework-to-build-a-blog/
    created = models.DateTimeField(auto_now_add=True)
    body = models.TextField(blank=False)
    user_id = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='comments', on_delete=models.CASCADE)
    post = models.ForeignKey('Posts', related_name='comments', on_delete=models.CASCADE)

    @property
    def time_left(self):
        return self.post.time_left

岗位型号:

class Posts(models.Model):
    title = models.CharField(max_length=100)
    topic = MultiSelectField(choices=TOPIC_CHOICES)
    creation_timestamp = models.DateTimeField(auto_now_add=True)
    expiration_timestamp = models.DateTimeField(default=expiration)
    body = models.CharField(max_length=255)
    user_id = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) #related_name='posts' 
    likes = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name="likes",blank=True)
    dislikes = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name="dislikes",blank=True)

    @property
    def is_expired(self):
        #taken from https://stackoverflow.com/questions/41505243/how-to-automatically-change-model-fields-in-django
        if now() > self.expiration_timestamp:
            return True
        return False
    
    @property
    def time_left(self):
        return self.expiration_timestamp - now()

序列化程序.py:

class CommentSerializer(serializers.ModelSerializer):

    time_left = serializers.ReadOnlyField()

    class Meta:
        model = Comment
        fields = ('created', 'body', 'user_id', 'post','time_left')

class PostsSerializer(serializers.ModelSerializer):
    is_expired = serializers.ReadOnlyField()
    time_left = serializers.ReadOnlyField()

    comments = CommentSerializer(source='comments.body',) ########## THIS IS THE PROBLEMATIC LINE #######

    class Meta:
        #make sure that the relevant fields are read only
        model = Posts
        fields = ('comments','title','topic','creation_timestamp','expiration_timestamp','body','user_id','likes','dislikes','is_expired','time_left') 

我相信有问题的行是来自 serializers.py 的以下行:

comments = CommentSerializer(source='comments.body',)

标签: pythondjangodjango-modelsdjango-rest-framework

解决方案


我认为您混淆了序列化程序可以接收的不同关键字。在这里我给你一个答案,以便你完全理解它。

您的comments变量应如下所示。

comments = CommentSerializer(many=True)

推荐阅读