python - 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',)
解决方案
我认为您混淆了序列化程序可以接收的不同关键字。在这里我给你一个答案,以便你完全理解它。
您的comments变量应如下所示。
comments = CommentSerializer(many=True)
推荐阅读
- linux - 如何在 Linux 3.4 内核中禁用 cpu 内核?
- angularjs - 如何在 angularjs-dropdown-multiselect 指令中使用 ng-blur 函数
- angular - 发射器功能没有得到处理
- java - Java - 如何使用 PrintStream/OutputStream 打印到命令行
- asp.net - 没有继承的 EF 6 中恼人的鉴别器列
- apache - 为什么当文件error.log不存在时Apache停止
- javascript - GTM 脚本后 dataLayer.push 不起作用
- python - 我想弄清楚怎么做
- ms-access - 错误 VBA 函数
- vba - VBA 代码在 Documents.Open 之后停止