无法从Django

问题描述

我已经为此苦了一段时间了。

在我的js代码中,我通过get请求获取用户发表的所有帖子。在我的django代码中,我向db查询所述帖子。当我得到结果的查询集时,将其传递给js代码在这里我尝试访问每个对象的作者(发布它的用户)以显示它。但是我直接给了pk,而不是用户名

所以基本上,我不知道如何获取每个对象的作者(创建帖子的用户)的用户名,即pk的身份。

models.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.

serializers.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);
}

views.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')