django - 无法从 Django 中的查询集中访问对象的用户名
问题描述
我已经为此苦苦挣扎了一段时间。
在我的 js 代码中,我通过获取请求获取用户发布的所有帖子。在我的 django 代码中,我在 db 中查询所述帖子。当我得到结果的查询集时,它被传递给 js 代码,在那里我尝试访问每个对象的作者(发布它的用户)以显示它。但是我给了 pk,而不是用户名。
所以基本上,我不知道如何获取用户名作为每个对象的作者(发帖的用户),而不是 pk。
模型.py:
class Post(models.Model):
author = models.ForeignKey(User, on_delete=models.CASCADE) ##
content = models.TextField(max_length=400, blank=False)
date_posted = models.DateTimeField(auto_now_add=True)
@property
def username(self):
return self.author.username
def __int__(self):
return self.
序列化程序.py:
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Post
fields = '__all__'
js代码:
function show_posts(sort) {
fetch(`api/post-list/${sort}`)
.then(response => response.json())
.then(posts => {
//for each email
console.log(posts);
posts.forEach(post => update_posts(post, sort));
});
}
function update_posts(post, sort) {
const element = document.createElement('div');
element.setAttribute("class", "post-dv");
console.log(post);
element.innerHTML += "Author: " + post.author + "<br>";
element.innerHTML += "Content: " + post.content + "<br>";
element.innerHTML += "Date: " + post.date_posted + "<br>";
element.innerHTML += "Likes: 0" + "<br>";
document.querySelector('#posts-view').append(element);
}
view.py 函数:
@api_view(['GET'])
def postList(request, sort):
if sort == "all":
posts = Post.objects.all().order_by('-date_posted')
for post in posts:
username = User.objects.get(username=post.author)
post.author = username
#print(post.author)
else:
try:
user = User.objects.get(username=sort)
posts = Post.objects.filter(author=user).order_by('-date_posted')
except User.DoesNotExist:
#return JsonResponse({"error": "User doesn't exist."}, status=400)
return Response(status=status.HTTP_400_BAD_REQUEST)
print(f"POSTS: {posts}")
serializer = PostSerializer(posts, many=True)
return Response(serializer.data)
在views.py 中的serializer.data 是这样的。我只能通过循环浏览帖子来更改作者值吗?或者我可以以某种方式修改其他东西吗?
[OrderedDict([('id', 18), ('content', 'nn'), ('date_posted', '08/13/2020 08:54:23'), ('author', 1)]) , OrderedDict([('id', 17), ('content', 'M'), ('date_posted', '08/13/2020 08:42:21'), ('author', 1)]) , OrderedDict([('id', 16), ('content', '6'), ('date_posted', '08/13/2020 08:27:42'), ('author', 1)]) , OrderedDict([('id', 15), ('content', '1'), ('date_posted', '08/12/2020 19:24:54'), ('author', 1)]) , OrderedDict([('id', 14), ('content', '11'), ('date_posted', '08/12/2020 19:24:23'), ('author', 1)]) , OrderedDict([('id', 13), ('content', '222'), ('date_posted', '08/12/2020 19:23:48'), ('author', 1)]), OrderedDict([('id', 12), ('content', '33'), ('date_posted', '08/12/2020 19:23: 31'), ('author', 1)]), OrderedDict([('id', 11), ('content', '4'), ('date_posted', '08/12/2020 19:23: 09'), ('author', 1)]), OrderedDict([('id', 10), ('content', '11'), ('date_posted', '08/12/2020 19:21: 48'), ('author', 1)]), OrderedDict([('id', 9), ('content', '1'), ('date_posted', '08/12/2020 19:19: 32'), ('author', 1)]), OrderedDict([('id', 8), ('content', '5'), ('date_posted', '08/12/2020 19:18: 34'), ('author', 1)]), OrderedDict([('id', 7), ('content', '4'), ('date_posted', '08/12/2020 19:18:10'), ('author', 1)]), OrderedDict([('id', 6), ('content', '7'), (' date_posted', '08/12/2020 19:17:10'), ('author', 1)]), OrderedDict([('id', 5), ('content', '5'), (' date_posted', '08/12/2020 19:13:54'), ('author', 1)]), OrderedDict([('id', 4), ('content', '7'), (' date_posted', '08/12/2020 19:10:11'), ('author', 1)]), OrderedDict([('id', 3), ('content', '2'), (' date_posted', '08/12/2020 18:46:23'), ('author', 1)]), OrderedDict([('id', 2), ('content', '6'), (' date_posted', '08/12/2020 18:33:55'), ('author', 1)]), OrderedDict([('id', 1), ('content', '0'), ('date_posted', '08/12/2020 13:59:46'), ('author', 1)])]
解决方案
您可以像这样更新您的序列化程序(使用SerializerMethodField
):
class PostSerializer(serializers.ModelSerializer):
username = serializers.SerializerMethodField()
class Meta:
model = Post
fields = '__all__'
def get_username(self, obj):
return obj.username
这将允许您访问username
对象的值。
还有其他解决方案,例如使用source
:
class PostSerializer(serializers.ModelSerializer):
username = serializers.CharField(source='username')
推荐阅读
- git - Jenkins 无法从公共存储库中从 git 中提取代码
- flutter - 在点击之前显示文本光标
- c - kill 函数中 sig 的可能值
- python - 在 python 中的 globals() 字典中添加一个新的键值对是否被认为是“定义的行为”?
- google-cloud-platform - Google AutoML“.txt to .jsonl”脚本所需的数据格式是什么?
- java - 在 Android Studio 中使用 Switch 启用/禁用 editText
- javascript - 尝试使用 moment.js 格式化字符串并计算时差时奇怪的输出
- javascript - 石头剪刀布编码挑战
- r - 在具有通用列引用的函数中使用 sqldf
- wxpython - 如何删除 MenuBar 中的 Window 下拉菜单?