文档章节

django rest framework 外键序列化方法与问题总结

_Change_
 _Change_
发布于 2018/10/17 23:50
字数 416
阅读 69
收藏 0

django rest framework 外键序列化方法与问题总结

当借口中需要出现一对多关系的时候,我们可以用rest_framwork的序列化功能来处理,代码如下.

# models.py
from django.db import models


class PersonGoals(models.Model):
    name = models.CharField(max_length=100, verbose_name="目标名称")
    desc = models.CharField(max_length=200, verbose_name="说明")
    status = models.IntegerField()

    class Meta:
        db_table = "person_goals"

    def __str__(self):
        return self.name


class KeyResult(models.Model):
    name = models.CharField(max_length=100, verbose_name="结果名称")
    desc = models.CharField(max_length=200, verbose_name="结果说明")
    status = models.IntegerField()
    person = models.ForeignKey(to=PersonGoals, on_delete=None, related_name="result")

    class Meta:
        db_table = "key_result"

    def __str__(self):
        return self.name

# serialize.py
from rest_framework import serializers
from apple.models import PersonGoals, KeyResult


class KeyResultSerialize(serializers.ModelSerializer):
    class Meta:
        model = KeyResult
        fields = "__all__"


class PersonSerialize(serializers.ModelSerializer):
    result = KeyResultSerialize(many=True)  # 这里的result是ForeignKey中的related_name

    class Meta:
        model = PersonGoals
        fields = "__all__"

# views.py

from rest_framework.response import Response
from rest_framework.views import APIView

from apple.serializer import PersonSerialize, KeyResultSerialize
from apple.models import PersonGoals, KeyResult


class PersonView(APIView):
    def get(self, request):
        serialize = PersonSerialize(PersonGoals.objects.all(), many=True)
        return Response(serialize.data)


class KeyResultView(APIView):
    def get(self, request):
        serialize = KeyResultSerialize(KeyResult.objects.all(), many=True)
        return Response(serialize.data)

# urls.py
from django.urls import path
from apple import views
from rest_framework.urlpatterns import format_suffix_patterns

urlpatterns = [
    path("person/", views.PersonView.as_view(), name="person"),
    path("result/", views.KeyResultView.as_view(), name="result")
]

urlpatterns = format_suffix_patterns(urlpatterns)

效果如下

访问接口 http://127.0.0.1:8000/person/

HTTP 200 OK
Allow: GET, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

[
    {
        "id": 1,
        "result": [
            {
                "id": 1,
                "name": "学习多层接口处理方法",
                "desc": "使用1对多时的处理方法",
                "status": 1,
                "person": 1
            },
            {
                "id": 2,
                "name": "学习多层接口处理方法二",
                "desc": "不使用1对多处理",
                "status": 1,
                "person": 1
            }
        ],
        "name": "rest_framwork深度学习",
        "desc": "深入学习rest_framwork的api使用",
        "status": 1
    }
]

© 著作权归作者所有

共有 人打赏支持
_Change_
粉丝 15
博文 137
码字总数 78396
作品 0
普陀
QA/测试工程师
私信 提问
Django REST Framework 获得外键的值

问题:外键序列化,只显示 id 而不是内容 有两个 models,一个 model 是大学 University,包含字段 name。另一个是学生 Student。Student 中存在外键 university 指向 University 这个 mode...

楠木楠
2018/05/04
0
0
求解:怎么在serializer的时候对数据进行多表读写操作?

如何用无外键数据库,在 django rest framework 框架在序列化的时候实现多model数据增删改查?不知道使用什么方法实现; 为了优化,设计数据库的时候没有用外键,全部逻辑要自己写,然后用d...

cicigarto
2018/05/10
117
0
python3-开发进阶Django中序列化以及rest_framework的序列化

一、django框架的序列化 直接上代码 1、这是app下的models.py from django.db import models # Create your models here. class Course(models.Model): 2、这是app下的view.py,两种序列化方...

天王盖地虎宝塔镇河妖
2018/08/02
0
0
Django REST Framework 教程5 关系和超链接API

Tutorial 5: Relationships & Hyperlinked APIs src 到目前为止,在我们的API中关系(relationship)还是通过主键来表示的。在这部分的教程中,我们将用超链接方式来表示关系,从而提升API的...

readilen
2018/04/28
0
0
Django REST Framework 3.0 发布

Django REST Framework 3.0 发布,此版本经历了大约 4 年的迭代和细化,解决了之前序列化程序,字段和通用视图的问题。 此版本是增量版本,包括一些重大的 API 改进,升级需要你仔细阅读发行...

oschina
2014/12/02
4.7K
3

没有更多内容

加载失败,请刷新页面

加载更多

BCryptPasswordEncoder加密工具类

Spring Security 提供的 BCryptPasswordEncoder 加密算法进行加密 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;/** * <p> * BCryptPasswordEncoder加......

秋至丶枫以落
10分钟前
0
0
在 Linux 上使用 tarball

Tarball 提供了一种在 Linux 系统上备份和管理一组文件的通用方法。请按照以下提示了解如何创建它们,以及从中提取和删除单个文件。 “tarball” (LCTT 译注:国内也常称为“tar 包”)一词...

Linux就该这么学
26分钟前
2
0
2018年AI和ML(NLP、计算机视觉、强化学习)技术总结和2019年趋势(上)

摘要: 回顾2018,展望2019,计算机科学技术继续前进! 1、简介: 过去几年一直是人工智能爱好者和机器学习专业人士最幸福的时光。因为这些技术已经发展成为主流,并且正在影响着数百万人的生...

阿里云官方博客
30分钟前
4
0
UnsatisfiedLinkError sawindbg.dll

方法:搜索sawindbg.dll,然后将文件报错的目录下

洛水
31分钟前
2
0
说说不知道的Golang中参数传递

本文由云+社区发表 导言 几乎每一个C++开发人员,都被面试过有关于函数参数是值传递还是引用传递的问题,其实不止于C++,任何一个语言中,我们都需要关心函数在参数传递时的行为。在golang中...

腾讯云加社区
32分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部