1. 程式人生 > 實用技巧 >DRF - 序列化之生成資料鏈接 hypermedialink

DRF - 序列化之生成資料鏈接 hypermedialink

資料庫結構和此文章相同:https://www.cnblogs.com/sch01ar/p/14295875.html

urls.py:

from django.urls import path, re_path
from drf import views

urlpatterns = [
    path('userinfo/', views.UserInfoView.as_view()),
    re_path('group/(?P<group_pk>\d+)$', views.GroupView.as_view(), name='user_group'),
]

views.py:

from rest_framework.views import APIView
from rest_framework import serializers
from drf import models
import json
from django.shortcuts import HttpResponse


class UserModelSerializers(serializers.ModelSerializer):
    # view_name 和 URL 的別名一致
    # lookup_field="group_id" 是取 group 表下的 id 欄位生成 URL 中的 pk 值
    # lookup_url_kwarg 為 URL 中的引數即 pk 的值
    group = serializers.HyperlinkedIdentityField(view_name="user_group", lookup_field="group_id", lookup_url_kwarg="group_pk")

    class Meta:
        model = models.UserInfo
        # 顯示指定欄位
        fields = ["id", "username", "password", "group"]
        # 指定層次為 0
        depth = 0


class UserInfoView(APIView):
    def get(self, request, *args, **kwargs):
        users = models.UserInfo.objects.all()
        # context={'request': request} 是生成連結要加的引數
        ser = UserModelSerializers(instance=users, many=True, context={'request': request})
        ret = json.dumps(ser.data, ensure_ascii=False)
        return HttpResponse(ret)


class GroupSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.UserGroup
        fields = "__all__"


class GroupView(APIView):
    def get(self, request, *args, **kwargs):
        # 獲取 URL 中的 group_pk 引數的值
        pk = kwargs.get("group_pk")
        group_obj = models.UserGroup.objects.filter(pk=pk).first()
        ser = GroupSerializer(instance=group_obj, many=False)
        ret = json.dumps(ser.data, ensure_ascii=False)
        return HttpResponse(ret)

訪問:/userinfo/

訪問 /group/1