Kubernetes——Service详解

目录

一、Service介绍

二、Service类型

 三、Service使用

3.1 实验环境准备

3.2 ClusterIP类型的Service

3.2.1 Endpoint

3.2.2 负载分发策略  

3.3  HeadLiness类型的Service

3.4 NodePort类型的Service

3.5 LoadBalancer类型的Service

 3.5.1 什么是 OpenELB

 3.5.2 应用安装与配置

1 安装 OpenELB

2  添加 EIP 池 

 3 配置 Service 为 LoadBalancer

3.6 ExternalName类型的Service


一、Service介绍

        在kubernetes 中, pod 是应用程序的载体,我们可以通过 pod ip 来访问应用程序,但是 pod ip 地址不是固定的,这也就意味着不方便直接采用pod ip 对服务进行访问。
        为了解决这个问题,kubernetes 提供了 Service 资源, Service 会对提供同一个服务的多个 pod 进行聚合,并且提供一个统一的入口地址。通过访问Service 的入口地址就能访问到后面的 pod 服务。
        Service在很多情况下只是一个概念,真正起作用的其实是 kube-proxy 服务进程,每个 Node 节点上都运行着一个kube-proxy 服务进程。当创建 Service 的时候会通过 api-server etcd 写入创建的 service 的信息,而kube-proxy 会基于监听的机制发现这种 Service 的变动,然后 它会将最新的 Service 信息转换成对 应的访问规则

 

# 10.96.0.10:53 是service 提供的访问入口
# 当访问这个入口的时候,可以发现后面有两个 pod 的服务在等待调用,
# kube-proxy 会基于 rr (轮询)的策略,将请求分发到其中一个 pod 上去
# 这个规则会同时在集群内的所有节点上都生成,所以在任何一个节点上访问都可以。
[root @node1 ~ ] # ipvsadm -Ln
IP Virtual Server version 1.2.1 (size = 4096 )
Prot LocalAddress : Port Scheduler Flags
-> RemoteAddress : Port Forward Weight ActiveConn InActConn
TCP  10.96.0.10:53 rr
  -> 10.244.58.196:53             Masq    1      0          0         
  -> 10.244.58.197:53             Masq    1      0          0        

kube-proxy目前支持三种工作模式:

 userspace 模式

        userspace模式下, kube-proxy 会为每一个 Service 创建一个监听端口,发向 Cluster IP 的请求被
Iptables 规则重定向到 kube-proxy 监听的端口上, kube-proxy 根据 LB 算法选择一个提供服务的 Pod 并和其建立链接,以将请求转发到Pod 上。
        该模式下,kube-proxy 充当了一个四层负责均衡器的角色。由于 kube-proxy 运行在 userspace 中,在进行转发处理时会增加内核和用户空间之间的数据拷贝,虽然比较稳定,但是效率比较低。

iptables 模式
        iptables模式下, kube-proxy service 后端的每个 Pod 创建对应的 iptables 规则,直接将发向 ClusterIP的请求重定向到一个 Pod IP
        该模式下kube-proxy 不承担四层负责均衡器的角色,只负责创建 iptables 规则。该模式的优点是较userspace模式效率更高,但不能提供灵活的 LB 策略,当后端 Pod 不可用时也无法进行重试。

ipvs 模式
        ipvs模式和 iptables 类似, kube-proxy 监控 Pod 的变化并创建相应的 ipvs 规则。 ipvs 相对 iptables 转发效率更高。除此以外,ipvs 支持更多的 LB 算法。

 # 此模式必须安装ipvs内核模块,否则会降级为iptables

# 开启 ipvs
[root@k8s-master01 ~]# kubectl edit cm kube-proxy -n kube-system
Edit cancelled, no changes made.
修改: mode : "ipvs"
[root@k8s-master01 ~]# kubectl delete pod -l k8s-app=kube-proxy -n kube-system
pod "kube-proxy-65vrr" deleted
pod "kube-proxy-fl8f8" deleted
pod "kube-proxy-xwkjp" deleted
[root@k8s-node01 ~]# ipvsadm -Ln
TCP  10.96.0.10:53 rr
  -> 10.244.58.196:53             Masq    1      0          0         
  -> 10.244.58.197:53             Masq    1      0          0 

二、Service类型

Service的资源清单文件:

kind : Service # 资源类型
apiVersion : v1 # 资源版本
metadata : # 元数据
        name : service # 资源名称
        namespace : dev # 命名空间
spec : # 描述
        selector : # 标签选择器,用于确定当前 service 代理哪些 pod
                app : nginx
        type : # Service 类型,指定 service 的访问方式
        clusterIP : # 虚拟服务的 ip 地址
        sessionAffinity : # session 亲和性,支持 ClientIP None 两个选项
        ports : # 端口信息
                - protocol : TCP
                  port : 3017 # service 端口
                  targetPort : 5003 # pod 端口
                  nodePort : 31122 # 主机端口

ClusterIP:默认值,它是Kubernetes系统自动分配的虚拟IP,只能在集群内部访问

NodePort :将 Service 通过指定的 Node 上的端口暴露给外部,通过此方法,就可以在集群外部访问服务
LoadBalancer :使用外接负载均衡器完成到服务的负载分发,注意此模式需要外部云环境支持
ExternalName : 把集群外部的服务引入集群内部,直接使用

 三、Service使用

3.1 实验环境准备

在使用 service 之前,首先利用 Deployment 创建出 3 pod ,注意要为 pod 设置 app=nginx - pod 的标签创建deployment.yaml ,内容如下:
[root@k8s-master01 Service]# vim deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: pc-deployment
  namespace: dev
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx-pod
  template:
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
        - name: nginx
          image: nginx:1.17.1
          ports:
            - containerPort: 80

[root@k8s-master01 Service]# kubectl create -f deployment.yaml 
deployment.apps/pc-deployment created

#查看pod详情
[root@k8s-master01 Service]# kubectl get pods -n dev -o wide --show-labels
NAME                             READY   STATUS    RESTARTS   AGE     IP               NODE         NOMINATED NODE   READINESS GATES   LABELS
pc-deployment-5cb65f68db-ln95v   1/1     Running   0          3m40s   192.168.58.194   k8s-node02   <none>           <none>            app=nginx-pod,pod-template-hash=5cb65f68db
pc-deployment-5cb65f68db-mqtm8   1/1     Running   0          3m40s   192.168.85.193   k8s-node01   <none>           <none>            app=nginx-pod,pod-template-hash=5cb65f68db
pc-deployment-5cb65f68db-sqzcw   1/1     Running   0          3m40s   192.168.85.194   k8s-node01   <none>           <none>            app=nginx-pod,pod-template-hash=5cb65f68db
# 为了方便后面的测试,修改下三台 nginx index.html 页面(三台修改的 IP 地址不一致)
# kubectl exec -it pc-deployment-5cb65f68db-ln95v -n dev /bin/sh
#echo "192.168.58.194" > /usr/share/nginx/html/index.html
[root@k8s-master01 Service]# kubectl exec -it pc-deployment-5cb65f68db-ln95v -n dev /bin/sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
# echo "192.168.58.194" > /usr/share/nginx/html/index.html
# exit

[root@k8s-master01 Service]# kubectl exec -it pc-deployment-5cb65f68db-mqtm8 -n dev /bin/sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
# echo "192.168.85.193" > /usr/share/nginx/html/index.html
# exit
[root@k8s-master01 Service]# kubectl exec -it pc-deployment-5cb65f68db-sqzcw -n dev /bin/sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
# echo "192.168.85.194" >  /usr/share/nginx/html/index.html
# exit

# 修改完毕之后,访问测试
[root@k8s-master01 Service]# curl 192.168.58.194
192.168.58.194
[root@k8s-master01 Service]# curl 192.168.85.193
192.168.85.193
[root@k8s-master01 Service]# curl 192.168.85.194
192.168.85.194

3.2 ClusterIP类型的Service

创建 service-clusterip.yaml 文件
[root@k8s-master01 Service]# vim service-clusterip.yaml
apiVersion: v1
kind: Service
metadata:
  name: service-clusterip
  namespace: dev
spec:
  selector:
    app: nginx-pod
  clusterIP:        # service的ip地址,如果不写,默认会生成一个
  type: ClusterIP
  ports:
    - port: 80        # Service端口
      targetPort: 80     # pod端口

# 创建service
[root@k8s-master01 Service]# kubectl create -f service-clusterip.yaml 
service/service-clusterip created

# 查看service
[root@k8s-master01 Service]# kubectl get svc -n dev -o wide
NAME                TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE   SELECTOR
service-clusterip   ClusterIP   10.103.182.229   <none>        80/TCP    13s   app=nginx-pod

# 查看service的详细信息
# 在这里有一个Endpoints列表,里面就是当前service可以负载到的服务入口
[root@k8s-master01 Service]# kubectl describe svc service-clusterip -n dev
Name:              service-clusterip
Namespace:         dev
Labels:            <none>
Annotations:       <none>
Selector:          app=nginx-pod
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.103.182.229
IPs:               10.103.182.229
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         192.168.58.194:80,192.168.85.193:80,192.168.85.194:80
Session Affinity:  None
Events:            <none>

# 查看ipvs的映射规则
[root@k8s-master01 Service]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn      
TCP  10.103.182.229:80 rr
  -> 192.168.58.194:80            Masq    1      0          0         
  -> 192.168.85.193:80            Masq    1      0          0         
  -> 192.168.85.194:80            Masq    1      0          0         

# 访问10.103.182.229:80观察效果
[root@k8s-master01 Service]# curl 10.103.182.229:80
192.168.85.194
[root@k8s-master01 Service]# curl 10.103.182.229:80
192.168.58.194
[root@k8s-master01 Service]# curl 10.103.182.229:80
192.168.85.193

3.2.1 Endpoint

        Endpoint是 kubernetes 中的一个资源对象,存储在 etcd 中,用来记录一个 service 对应的所有 pod 的访问地址,它是根据service 配置文件中 selector 描述产生的。
        一个Service 由一组 Pod 组成,这些 Pod 通过 Endpoints 暴露出来, Endpoints 是实现实际服务的端点 集合 。换句话说, service pod 之间的联系是通过 endpoints 实现的。

3.2.2 负载分发策略  

Service 的访问被分发到了后端的 Pod 上去,目前 kubernetes 提供了两种负载分发策略:
        如果不定义,默认使用kube-proxy 的策略,比如随机、轮询
        基于客户端地址的会话保持模式,即来自同一个客户端发起的所有请求都会转发到固定的一个Pod上

此模式可以使在spec中添加 sessionAffinity:ClientIP 选项

# 查看ipvs的映射规则【rr 轮询】
[root@k8s-master01 Service]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.103.182.229:80 rr
  -> 192.168.58.194:80            Masq    1      0          0         
  -> 192.168.85.193:80            Masq    1      0          0         
  -> 192.168.85.194:80            Masq    1      0          0  

# 循环访问测试
[root@k8s-master01 Service]# while true; do curl 10.103.182.229:80; sleep 5; done;
192.168.58.194
192.168.85.194
192.168.85.193
192.168.58.194
192.168.85.194
192.168.85.193
192.168.58.194
192.168.85.194
192.168.85.193
192.168.58.194
192.168.85.194
192.168.85.193

# 修改分发策略----sessionAffinity:ClientIP

# 查看ipvs规则【persistent 代表持久】
[root@k8s-master01 Service]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.103.182.229:80 rr persistent 10800
  -> 192.168.58.194:80            Masq    1      0          0         
  -> 192.168.85.193:80            Masq    1      0          0         
  -> 192.168.85.194:80            Masq    1      0          0 

# 循环访问测试
[root@k8s-master01 Service]# while true; do curl 10.103.182.229:80 ; sleep 3 ; done;
192.168.85.194
192.168.85.194
192.168.85.194
192.168.85.194

# 删除service
[root@k8s-master01 Service]# kubectl delete -f  service-clusterip.yaml 
service "service-clusterip" deleted

3.3  HeadLiness类型的Service

        在某些场景中,开发人员可能不想使用Service 提供的负载均衡功能,而希望自己来控制负载均衡策略,针对这种情况,kubernetes 提供了 HeadLiness Service ,这类 Service 不会分配 Cluster IP ,如果想要访问service ,只能通过 service 的域名进行查询。
创建 service-headliness.yaml
[root@k8s-master01 Service]# vim service-headliness.yaml
apiVersion: v1
kind: Service
metadata:
  name: service-headliness
  namespace: dev
spec:
  selector:
    app: nginx-pod
  clusterIP: None # 将ClusterIP设置为None,即可创建headliness Service
  type: ClusterIP
  ports:
    - port: 80
      targetPort: 80

# 创建service
[root@k8s-master01 Service]# kubectl create -f service-headliness.yaml 
service/service-headliness created

# 获取service, 发现CLUSTER-IP未分配
[root@k8s-master01 Service]# kubectl get svc service-headliness -n dev -o wide
NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE   SELECTOR
service-headliness   ClusterIP   None         <none>        80/TCP    54s   app=nginx-pod

# 查看service详情
[root@k8s-master01 Service]# kubectl describe svc service-headliness -n dev
Name:              service-headliness
Namespace:         dev
Labels:            <none>
Annotations:       <none>
Selector:          app=nginx-pod
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                None
IPs:               None
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         192.168.58.194:80,192.168.85.193:80,192.168.85.194:80
Session Affinity:  None
Events:            <none>

# 查看域名的解析情况
[root@k8s-master01 Service]# kubectl exec -it pc-deployment-5cb65f68db-ln95v -n dev /bin/sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
# cat /etc/resolv.conf
nameserver 10.96.0.10
search dev.svc.cluster.local svc.cluster.local cluster.local
options ndots:5

[root@k8s-master01 Service]# dig @10.96.0.10 service-headliness.dev.svc.cluster.local
;; ANSWER SECTION:
service-headliness.dev.svc.cluster.local. 30 IN	A 192.168.58.194
service-headliness.dev.svc.cluster.local. 30 IN	A 192.168.85.193
service-headliness.dev.svc.cluster.local. 30 IN	A 192.168.85.194

3.4 NodePort类型的Service

        在之前的样例中,创建的Service ip 地址只有集群内部才可以访问,如果希望将 Service 暴露给集群外部使用,那么就要使用到另外一种类型的Service ,称为 NodePort 类型。 NodePort 的工作原理其实就是 service 的端口映射到 Node 的一个端口上 ,然后就可以通过 NodeIp:NodePort 来访问 service 了。

创建service-nodeport.yaml

[root@k8s-master01 Service]# vim service-nodeport.yaml
apiVersion: v1
kind: Service
metadata:
  name: service-nodeport
  namespace: dev
spec:
  selector:
    app: nginx-pod
  type: NodePort # service类型
  ports:
    - port: 80
      nodePort: 30002 # 指定绑定的node的端口(默认的取值范围是:30000-32767),如果不指定,会默认分配
      targetPort: 80

# 创建service
[root@k8s-master01 Service]# kubectl create -f service-nodeport.yaml 
service/service-nodeport created


# 查看service
[root@k8s-master01 Service]# kubectl get svc -n dev -o wide
NAME               TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE    SELECTOR
service-nodeport   NodePort   10.104.75.225   <none>        80:30002/TCP   116s   app=nginx-pod

# 接下来可以通过电脑主机的浏览器去访问集群中任意一个nodeip的30002端口,即可访问到pod

k8s-node01(http://192.168.186.101:30002/

 k8s-node02(http://192.168.186.102:30002/

3.5 LoadBalancer类型的Service

        LoadBalancer和 NodePort 很相似,目的都是向外部暴露一个端口,区别在于 LoadBalancer 会在集群的外部再来做一个负载均衡设备,而这个设备需要外部环境支持的,外部服务发送到这个设备上的请求,会被设备负载之后转发到集群中

三款开源 Kubernetes 负载均衡器: MetalLB vs PureLB vs OpenELB

 3.5.1 什么是 OpenELB

        K8S 对集群外暴露服务有三种方式: NodePort Ingress Loadbalancer NodePort 用于暴露 TCP 服 务(4 ) ,但限于对集群节点主机端口的占用,不适合大规模使用; Ingress 用于暴露 HTTP 服务 (7 ) , 可对域名地址做路由分发;Loadbalancer 则专属于云服务,可动态分配公网网关。 对于私有云集群,没有用到公有云服务,能否使用 LoadBalancer 对外暴露服务呢?
        答案当然是肯定的,OpenELB 正是为裸金属服务器提供 LoadBalancer 服务而生的!
由青云科技 KubeSphere 容器团队开源的负载均衡器插件 OpenELB 正式通过 CNCF (云原生计算基金会)TOC 技术委员会审核 .

 3.5.2 应用安装与配置

1 安装 OpenELB
前提:
首先需要为 kube-proxy 启用 strictARP ,以便 Kubernetes 集群中的所有网卡停止响应其他网卡的
ARP 请求,而由 OpenELB 处理 ARP 请求。
# 注意:是修改,默认 strictARP false
# kubectl edit configmap kube-proxy -n kube-system
......
ipvs:
strictARP: true
......

openelb/deploy/openelb.yaml 在 master ·OpenELB/OpenELB (github.com)# wget -c https://openelb/deploy/openelb.yaml 在 master ·OpenELB/OpenELB (github.com)

 [root@k8s-master01 Service]# vim openelb.yaml

修改镜像地址:修改两处
image: k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1
image: registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook
certgen:v1.1.1

安装

 [root@k8s-master01 Service]# kubectl apply -f openelb.yaml 

查看
[root@k8s-master01 Service]# kubectl get po -n openelb-system
NAME                                  READY   STATUS              RESTARTS   AGE
openelb-admission-create-lg5td        0/1     ImagePullBackOff    0          21m
openelb-admission-patch-gr276         0/1     ImagePullBackOff    0          21m
openelb-controller-64f7fb77f8-9xhq2   0/1     ContainerCreating   0          21m
openelb-speaker-7gztc                 1/1     Running             0          21m
openelb-speaker-9xkmt                 1/1     Running             0          21m
openelb-speaker-cc8d2                 1/1     Running             0          21m
2  添加 EIP  
EIP 地址要与集群主机节点在同一网段内,且不可绑定任何网卡;
[root@master ~]# cat ip_pool.yml
apiVersion: network.kubesphere.io/v1alpha2
kind: Eip
metadata:
name: eip-pool
spec:
address: 172.16.90.231-172.16.90.238
protocol: layer2
disable: false
interface: eth0
# kubectl apply -f ip_pool.yml
[root@master ~]# kubectl get eip
NAME CIDR USAGE TOTAL
eip-pool 172.16.90.231-172.16.90.238 0 8
 3 配置 Service LoadBalancer
Service 类型修改为 LoadBalancer ,同时 annotations 中添加如下三行
lb.kubesphere.io/v1alpha1: openelb
protocol.openelb.kubesphere.io/v1alpha1: layer2
eip.openelb.kubesphere.io/v1alpha2: layer2-eip

总体配置清单如下:

[ root@master test ] # cat svc-lb.yml
apiVersion : v1
kind : Service
metadata :
        name : svc-lb
        namespace : dev
        annotations :
                lb.kubesphere.io/v1alpha1 : openelb
                protocol.openelb.kubesphere.io/v1alpha1 : layer2
                eip.openelb.kubesphere.io/v1alpha2 : eip-pool
spec :
        selector :
                app : nginx-pod
        type : LoadBalancer
        ports :
                - port : 80
                  targetPort : 80
[ root@master test ] # kubectl apply -f svc-lb.yml
[ root@master test ] # kubectl get svc svc-lb -n dev
NAME         TYPE                 CLUSTER-IP         EXTERNAL-IP         PORT(S)                 AGE
svc-lb         LoadBalancer   10.103.128.30      172.16.90.231         80:32532/TCP         22m

测试负载均衡  

[root@node2 ~] # for i in {1..9}
> do
> curl 172 .16.90.231
> done
web test page, ip is 10 .224.166.181 .
web test page, ip is 10 .224.166.179 .
web test page, ip is 10 .224.104.9 .
web test page, ip is 10 .224.166.181 .
web test page, ip is 10 .224.166.179 .
web test page, ip is 10 .224.104.9 .
web test page, ip is 10 .224.166.181 .
web test page, ip is 10 .224.166.179 .
web test page, ip is 10 .224.104.9 .

3.6 ExternalName类型的Service

        ExternalName类型的 Service 用于引入集群外部的服务,它通过 externalName 属性指定外部一个服务的地址,然后在集群内部访问此service 就可以访问到外部的服务了。

 apiVersion: v1

kind : Service
metadata :
        name : service-externalname
        namespace : dev
spec :
        type : ExternalName          # service 类型
        externalName : www.baidu.com          # 改成 ip 地址也可以

[root@k8s-master01 Service]# vim service-externalname.yaml

apiVersion: v1
kind: Service
metadata:
  name: service-externalname
  namespace: dev
spec:
  type: ExternalName # service类型
  externalName: www.baidu.com # 改成ip地址也可以


# 创建service
[root@k8s-master01 Service]# kubectl create -f service-externalname.yaml 
service/service-externalname created

# 域名解析
[root @master ~ ] # dig @10.96.0.10 service-externalname.dev.svc.cluster.local
service-externalname.dev.svc.cluster.local. 30 IN CNAME www.baidu.com.
www.baidu.com.              30         IN          CNAME         www.a.shifen.com.
www.a.shifen.com.          30          IN              A                    39.156.66.18
www.a.shifen.com.          30         IN              A                    39.156.66.14
  • 16
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Django 中,ModelSerializer 是 Django REST Framework 中最常用的序列化器之一。它是一个自动化序列化组件,可以帮助我们快速地将一个 Django 模型转换成一个 RESTful API 的响应格式。 具体来说,ModelSerializer 将一个 Django 模型转换成一个 JSON 格式的响应,同时也可以将一个 JSON 格式的请求转换成 Django 模型。这使得我们能够很方便地将 Django 模型与 RESTful API 集成起来。 使用 ModelSerializer 需要进行如下步骤: 1. 创建一个继承自 ModelSerializer 的序列化器类。 2. 在序列化器类中指定模型类和需要序列化的字段。 3. 在视图函数中使用序列化器类进行序列化。 下面是一个示例代码: ```python from rest_framework import serializers from myapp.models import MyModel class MyModelSerializer(serializers.ModelSerializer): class Meta: model = MyModel fields = '__all__' ``` 上述代码中,我们首先导入了 serializers 模块和 MyModel 模型类。然后,我们创建了一个名为 MyModelSerializer 的序列化器类,它继承自 ModelSerializer。在序列化器类的 Meta 类中,我们指定了模型类为 MyModel,并且将 fields 属性设置为 '__all__',表示序列化所有字段。 接下来,在视图函数中使用 MyModelSerializer 进行序列化: ```python from rest_framework import generics from myapp.serializers import MyModelSerializer from myapp.models import MyModel class MyModelList(generics.ListCreateAPIView): queryset = MyModel.objects.all() serializer_class = MyModelSerializer ``` 上述代码中,我们首先导入了 generics 模块、MyModelSerializer 序列化器类和 MyModel 模型类。然后,我们创建了一个名为 MyModelList 的视图类,它继承自 generics.ListCreateAPIView。在视图类中,我们指定了查询集为 MyModel.objects.all(),序列化器类为 MyModelSerializer。 以上就是 ModelSerializer 的基本使用方法。通过 ModelSerializer,我们可以很方便地将一个 Django 模型转换成一个 RESTful API 的响应格式,使得我们能够更加方便地构建 Web 应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值