首页 > 解决方案 > Django 模型序列化只返回外键的主键

问题描述

我正在用 Django 构建博客网站。序列化后,具有 Django 内置 User 模型的外键字段的 Post 模型,Post 模型返回对 User 模型的整数外键引用,而我期望整个 User 对象数据而不是仅获取整数。帖子models.py:

from django.db import models
from django.contrib.auth.models import User
class Post(models.Model):
    author = models.ForeignKey(User,on_delete=models.CASCADE)
    body = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

序列化程序.py:

from rest_framework  import serializers
from .models import Post
class PostSerializer(serializers.ModelSerializer):
    class Meta:
        fields = ('id', 'author','body','created_at')
        model = Post

意见.py:

from django.shortcuts import render
from rest_framework import generics
from .models import Post
from .serializers import PostSerializer
from .permissions import IsAuthorOrReadOnly

class PostList(generics.ListCreateAPIView):
    serializer_class = PostSerializer
    queryset = Post.objects.all().order_by('-created_at')#sorted by created_at descending 

class PostDetail(generics.RetrieveUpdateDestroyAPIView):
    permission_classes = (IsAuthorOrReadOnly,)
    serializer_class = PostSerializer
    queryset = Post.objects.all()

我想要

 {
        "id": 15,
        "author": {"fisrt_name":"firstname","last_name":"namelast","username":"username1","email":"example@gamil.com"},
        "body": "hello world2",
        "created_at": "2020-12-23T13:53:17.741635Z"
    }

代替

 {
        "id": 15,
        "author": 21,
        "body": "hello world2",
        "created_at": "2020-12-23T13:53:17.741635Z"
    }

标签: pythondjangoserializationdjango-rest-frameworkforeign-keys

解决方案


你可以像这样制作你的用户序列化器:

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = [...] # put your fields instead of "..."
        depth = 1

然后像这样使用嵌套序列化程序:

class PostSerializer(serializers.ModelSerializer):
    author = UserSerializer(many=false)
    class Meta:
        fields = ('id','body','created_at')
        model = Post

推荐阅读