除了一个尴尬的问题,我的所有东西都工作正常。
首先看看我的模型:
from django.db import models
from django.contrib.auth.models import User
class Author(models.Model):
name = models.ForeignKey(User, on_delete=models.CASCADE)
detail = models.TextField()
def __str__(self):
return self.name.username
class Category(models.Model):
name = models.CharField(max_length=100)
class Article(models.Model):
author = models.ForeignKey(Author, on_delete=models.CASCADE)
title = models.CharField(max_length=200)
body = models.TextField()
category = models.ForeignKey(Category, on_delete=models.CASCADE)
这是序列化程序类:
class ArticleSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = ['id', 'author', 'title', 'body', 'category']
这是我的观点
class ArticleSingle(RetrieveAPIView):
queryset = Article.objects.all()
serializer_class = ArticleSerializer
lookup_field = 'pk'
我的网址是
path('api/v1/article/<int:pk>/detail', views.ArticleSingle.as_view(), name='article-single'),
其他所有方法都可以正常工作,但问题是,当我在url中获取文章详细信息时,它显示除问题以外的其他所有内容都很好,即作者名称和类别名称返回数字值。.
以下是意外结果:
HTTP 200 OK
Allow: GET, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept
{
"id": 2,
"author": 1,
"title": "i am title",
"body": "i am body",
"category": 1
}
请仔细查看author
和category
,它返回数值,为什么?
答案 0 :(得分:0)
因为在您的serializer
中,您并没有指向模型实例的ForeignKey
字段中显示的witch字段。如果您未设置ForeignKey的字段,那么在序列化程序中只会显示“ id” 。您可以将HyperLinkModel用作this doc:
class ArticleSerializer(serializers.ModelSerializer):
author = serializers.HyperlinkedRelatedField(
many=True,
read_only=True,
)
category = serializers.HyperlinkedRelatedField(
many=True,
read_only=True,
)
class Meta:
model = Article
fields = ('id', 'author', 'title', 'body', 'category') # use '(' instead of '['
答案 1 :(得分:0)
在对象的外键相关字段的json响应中获取ID或pk是正常的。 如果您想使用字符串,则需要像这样编辑序列化器字段
class ArticleSerializer(serializers.ModelSerializer):
author = serializers.StringRelatedField(read_only=True)
category = serializers.StringRelatedField(read_only=True)
class Meta:
model = Article
fields = ['id', 'author', 'title', 'body', 'category']