30.Django_framework_外键定义

元气小坏坏 提交于 2019-12-09 19:37:59

Django_framework_模型序列化器ModelSerializer

再看一下接口的模型类:
之前定义的projects/model.py

from django.db import models



# Create your models here.
class Interfaces(models.Model):
    # 创建Projects模型类

    name = models.CharField(verbose_name="接口名称",max_length=200,unique=True,help_text="接口名称")
    method = models.CharField(verbose_name="接口类型",max_length=50,help_text="接口类型")
    desc = models.TextField(verbose_name="简要描述",max_length=200,help_text="简要描述",blank=True,default="")

#外键
    # 第一个参数为关联的模型路径(应用名.模型类)
    #第二个参数为副表删除后,该字段的处理方式
    #CASCADE:子表也会被删除
    #SET_NULL:当前外键会被设置为None
    # PROJECT:会报错
    # SET_DEFAULT:设置默认值同时需要指定默认值,null=True

    project = models.ForeignKey('projects.Projects',on_delete=models.CASCADE,
                                verbose_name="所属项目",help_text="所属项目",null=True, blank=True)

   #设定数据库名称等信息
    class Meta:
        db_table="tb_interfaces"
        verbose_name="接口"
        verbose_name_plural="接口"

定义interfaces/serializer.py文件

from rest_framework import serializers


from interfaces.models import Interfaces


class ProjectsModelSerializer(serializers.ModelSerializer):
    class Meta:

        model = Interfaces
        fields = "__all__"

我们看一下ipython结果:

from interfaces.serializer import ProjectsModelSerializer
ProjectsModelSerializer()
Out[4]: 
ProjectsModelSerializer():
    id = IntegerField(label='ID', read_only=True)
    name = CharField(help_text='接口名称', label='接口名称', max_length=200, validators=[<UniqueValidator(queryset=Interfaces.objects.all())>])
    method = CharField(help_text='接口类型', label='接口类型', max_length=50)
    desc = CharField(allow_blank=True, help_text='简要描述', label='简要描述', max_length=200, required=False, style={'base_template': 'textarea.html'})
    project = PrimaryKeyRelatedField(allow_null=True, help_text='所属项目', label='所属项目', queryset=Projects.objects.all(), required=False)

发现会自动生成外键的字段,
数据库中的外键字段,默认会生成PrimaryKeyRelatedField序列化字段,
序列化输出的值为外键的ID值;

  • 获取单条数据,看一下shell中的结果
from interfaces.serializer import InterfacesModelSerializer
from interfaces.models import Interfaces
one_obj = Interfaces.objects.get(id= 4)
InterfacesModelSerializer(one_obj).data
Out[5]: {'id': 4, 'name': '登录接口', 'method': 'post', 'desc': '登录接口', 'project': 10}

2. 修改为StringRelatedField

from rest_framework import serializers


from interfaces.models import Interfaces

project = serializers.StringRelatedField(label='所属项目')
class InterfacesModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = Interfaces
        fields = "__all__"
from interfaces.serializer import InterfacesModelSerializer
from interfaces.models import Interfaces
one_obj = Interfaces.objects.get(id= 4)
InterfacesModelSerializer(one_obj).data
Out[5]: {'id': 4, 'name': '登录接口', 'method': 'post', 'desc': '登录接口', 'project': 10}

发现此字段被序列化为关联对象字符串表达式形式,(即__str__)方法返回值
在这里插入图片描述

3.使用SlugRelatedField

SlugRelatedField被序列化为关联对象的指定字段数据

from rest_framework import serializers


from interfaces.models import Interfaces

# project = serializers.StringRelatedField(label='所属项目')

project = serializers.SlugRelatedField(slug_field='tester')
class InterfacesModelSerializer(serializers.ModelSerializer):
    
    class Meta:
        model = Interfaces
        fields = "__all__"

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!