Django rest框架外键作为整数返回

Django rest框架外键作为整数返回,django,vue.js,django-models,django-rest-framework,xmlhttprequest,Django,Vue.js,Django Models,Django Rest Framework,Xmlhttprequest,我试图用drf在django中序列化一个模型,但现在我面临的问题是,作为外键的author被作为整数返回。我使用Vue.js作为前端。谁来帮忙 Serializers.py: from rest_framework import serializers from .models import Post class PostSerialiers(serializers.ModelSerializer): class Meta: model = Post f

我试图用drf在django中序列化一个模型,但现在我面临的问题是,作为外键的author被作为整数返回。我使用Vue.js作为前端。谁来帮忙

Serializers.py:

from rest_framework import serializers
from .models import Post

class PostSerialiers(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = "__all__"
Views.py:

from django.shortcuts import render
from .models import Post
from .serializers import PostSerialiers
from rest_framework import viewsets

class PostView(viewsets.ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerialiers

def Home(request):
    return render(request, 'Content/Home.html')
models.py:

from django.db import models

from django.db import models
from django.contrib.auth.models import User

class Post(models.Model):
    title = models.CharField(max_length=100, blank=True, null=True)
    caption = models.CharField(max_length=1200, blank=True, null=True)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
模板:

<div v-for="post in obj" style="width: 100%;" class="ui card">
      <div class="content">
        <div class="header">[[post.title]]</div>
        <div class="meta">2 days ago</div>
        <div class="description">
          <p>[[post.caption]]</p>
        </div>
      </div>
      <div class="extra content">
        <i class="check icon"></i>
        [[post.author]]
      </div>
    </div>
    <script>
      function loadDoc() {
        var xhr = new XMLHttpRequest();
        xhr.onreadystatechange = function () {
          if (this.readyState == 4 && this.status == 200) {
            var app = new Vue({
              el: '#root',
              delimiters: ['[[', ']]'],
              data:{
                "obj" : JSON.parse(this.responseText)
              }
            
          })
          }
        }
        xhr.open('GET', 'http://localhost:8000/apiposts/', true);
        xhr.send()
      }

      loadDoc()

    </script>

请有人帮助

在您的Serializer.py中,更改以下内容:

class PostSerialiers(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = "__all__"
为此:

class PostSerialiers(serializers.ModelSerializer):
    author = serializers.StringRelatedField()
    class Meta:
        model = Post
        fields = ['title','caption','author']

在Serializer.py中,更改以下内容:

class PostSerialiers(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = "__all__"
为此:

class PostSerialiers(serializers.ModelSerializer):
    author = serializers.StringRelatedField()
    class Meta:
        model = Post
        fields = ['title','caption','author']
为用户创建一个新的序列化程序

您必须为Post模型创建一个新的序列化程序,因为在检索时,您正在查找用户名或电子邮件(无论您使用什么),然后在创建新Post时,您希望使用开箱即用的功能从数据库中选择用户。理想情况下,这是不可能的,因为在引擎盖下ForeignKey使用PrimaryKeyRelatedField,并且当您试图通过在PostSerializer中将author设置为UserSerializer来获取用户名时,类似这样:

class PostSerialiers(serializers.ModelSerializer):
    author = UserSerializer(many=False)
    class Meta:
        model = Post
        fields = ['title','caption','author']
您将失去开箱即用功能,以便在Post上添加用户。因为现在您将处理UserSerializer中定义的字段。如果你不这样做;在引擎盖下,它将使用PrimaryKeyRelatedField,它将为您提供在创建帖子时选择用户的选项,并且您将在检索数据时释放用户名。如果您客观地看,您希望这两个功能都在同一个视图集中。因此,您可以有两个不同的序列化程序用于两个不同的目的


class PostSerialiers(serializers.ModelSerializer):
    # this serializer will deal with creating Post with option to select User
    author = serializers.PrimaryKeyRelatedField(queryset=User.objects.all())
    class Meta:
        model = Post
        fields = "__all__"


class NewPostSerializer(serializers.ModelSerializer):
    # this serializer will deal with retrieving data with username/email
    author = UserSerializer(many=False, read_only=True)
    
    class Meta:
        model = Post
        fields = "__all__"
最后,在PostView中,您需要覆盖列表,因为在检索时,您需要用户名而不是pk,所以您需要使用序列化程序来处理用户名,即NewPostSerializer

views.py

为用户创建一个新的序列化程序

您必须为Post模型创建一个新的序列化程序,因为在检索时,您正在查找用户名或电子邮件(无论您使用什么),然后在创建新Post时,您希望使用开箱即用的功能从数据库中选择用户。理想情况下,这是不可能的,因为在引擎盖下ForeignKey使用PrimaryKeyRelatedField,并且当您试图通过在PostSerializer中将author设置为UserSerializer来获取用户名时,类似这样:

class PostSerialiers(serializers.ModelSerializer):
    author = UserSerializer(many=False)
    class Meta:
        model = Post
        fields = ['title','caption','author']
您将失去开箱即用功能,以便在Post上添加用户。因为现在您将处理UserSerializer中定义的字段。如果你不这样做;在引擎盖下,它将使用PrimaryKeyRelatedField,它将为您提供在创建帖子时选择用户的选项,并且您将在检索数据时释放用户名。如果您客观地看,您希望这两个功能都在同一个视图集中。因此,您可以有两个不同的序列化程序用于两个不同的目的


class PostSerialiers(serializers.ModelSerializer):
    # this serializer will deal with creating Post with option to select User
    author = serializers.PrimaryKeyRelatedField(queryset=User.objects.all())
    class Meta:
        model = Post
        fields = "__all__"


class NewPostSerializer(serializers.ModelSerializer):
    # this serializer will deal with retrieving data with username/email
    author = UserSerializer(many=False, read_only=True)
    
    class Meta:
        model = Post
        fields = "__all__"
最后,在PostView中,您需要覆盖列表,因为在检索时,您需要用户名而不是pk,所以您需要使用序列化程序来处理用户名,即NewPostSerializer

views.py


在meta类中使用depth=1如果您想要发布作者的完整详细信息,那么您可以在html中使用post.author.first\u name或post.author.last\u name,post.author。email@giveJob不,它坏了。你通过邮递员查过了吗?如果在下面添加字段=全部或任何错误,深度=1应该可以工作?@giveJob否我没有not@giveJob如果可以的话,请帮忙。在过去的一个月里,我一直在努力解决这个问题,或者在类meta中souse depth=1,如果你想得到作者的完整细节,那么你可以在html中使用post.author.first\u name或post.author.last\u name,post.author。email@giveJob不,它坏了。你通过邮递员查过了吗?如果在下面添加字段=全部或任何错误,深度=1应该可以工作?@giveJob否我没有not@giveJob如果可以的话,请帮忙。在过去的一个多月里,我一直在努力解决这个问题,但它不允许我将用户与帖子联系起来。我的意思是,当我试图上传一篇新文章时,选择作者的选项丢失了,但它不允许我将用户与文章关联。我的意思是,当我试图上传一篇新文章时,选择作者的选项丢失了