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

本文详细介绍了在Django REST Framework中如何处理一对多关系的序列化,通过具体的代码示例展示了如何定义模型、序列化器,并在视图中使用它们,最后展示了接口调用的效果。

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
    }
]
223916_bL9y_2663968.jpg
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值