Django Rest API端点显示意外的数值而不是字符串

时间:2019-06-22 05:02:16

标签: python django python-3.x django-rest-framework

除了一个尴尬的问题,我的所有东西都工作正常。

首先看看我的模型:

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
}

请仔细查看authorcategory,它返回数值,为什么?

2 个答案:

答案 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']