Django rest框架外键作为整数返回
我试图用drf在django中序列化一个模型,但现在我面临的问题是,作为外键的author被作为整数返回。我使用Vue.js作为前端。谁来帮忙 Serializers.py: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
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如果可以的话,请帮忙。在过去的一个多月里,我一直在努力解决这个问题,但它不允许我将用户与帖子联系起来。我的意思是,当我试图上传一篇新文章时,选择作者的选项丢失了,但它不允许我将用户与文章关联。我的意思是,当我试图上传一篇新文章时,选择作者的选项丢失了