Django处理枚举(枚举模型)以及source的使用

在这里插入图片描述


1、定义模型类、序列化器类

定义模型类models.py;项目模型类、接口模型类、用例模型类

from django.db import models

class Test_Project(models.Model):
    name = models.CharField(help_text='项目名称', verbose_name='项目名称',
                            max_length=60,
                            unique=True)
    desc = models.TextField(help_text='项目描述', blank=True, null=True)
    create_time = models.DateTimeField(auto_now_add=True)
    update_time = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = "t_test_project"
        verbose_name = "项目表"
        verbose_name_plural = verbose_name
        ordering = ['id']

    def __str__(self):
        return self.name

CHOICES = [('1', '项目接口'),('2', '外部接口')]
type = models.CharField(verbose_name='接口类型', help_text='接口类型', max_length=40,default='1', choices=CHOICES)

from django.db import models

class Test_Interface(models.Model):
    CHOICES = [
        ('1', '项目接口'),
        ('2', '外部接口')
    ]

    name = models.CharField(help_text='接口名称', verbose_name='接口名称',
                            max_length=60,
                            unique=True)
    desc = models.TextField(help_text='接口描述', blank=True, null=True, default='描述')
    type = models.CharField(verbose_name='接口类型', help_text='接口类型',
                            max_length=40,
                            default='1', choices=CHOICES)
    project = models.ForeignKey(Test_Project, on_delete=models.CASCADE)
    playcount=models.IntegerField(help_text='访问量',verbose_name='访问量',default=0)
    commentcount = models.IntegerField(default=0, verbose_name='评论量')

    class Meta:
        db_table = 't_test_interface'
        verbose_name = "接口表"
        verbose_name_plural = verbose_name
        ordering = ['id']

    def __str__(self):
        return self.name

from django.db import models

class Test_Testcase(models.Model):
    name = models.CharField(help_text='用例名称', verbose_name='用例名称',
                            max_length=60,
                            unique=True)
    desc = models.TextField(help_text='用例名称', blank=True, null=True)
    create_time = models.DateTimeField(auto_now_add=True)
    update_time = models.DateTimeField(auto_now=True)
    interface = models.ForeignKey(Test_Interface, on_delete=models.CASCADE)

    class Meta:
        db_table = "t_test_testcase"
        verbose_name = "用例表"
        verbose_name_plural = verbose_name
        ordering = ['id']

    def __str__(self):
        return self.name

序列化器类设计

from rest_framework import serializers

from ttest.models import Test_Project,Test_Interface


class TProjectSerializer(serializers.ModelSerializer):

    class Meta:
        model=Test_Project
        fields='__all__'


class TInterfaceSerializer(serializers.ModelSerializer):
    class Meta:
        model=Test_Interface
        fields='__all__'

访问接口:前端展示的数据type:“1”
使用默认的序列化器时,视图函数访问 具有choices参数 的字段或 一对一 或 一对多 或 多对多 字段时,返回的数据只有 id 值,就像下面这种方式,性别是0或1
在这里插入图片描述

2、对上面这些场景使用source参数

get_xxx_display 用于显示 choices 参数对应的文本信息。

序列化器文件:serializers.py

class TProjectSerializer(serializers.ModelSerializer):

    class Meta:
        model=Test_Project
        fields='__all__'


class TInterfaceSerializer(serializers.ModelSerializer):
    type = serializers.ChoiceField(choices=Test_Interface.CHOICES,
                                   source="get_type_display",
                                   read_only=True)  # 设置source="get_属性_display"即可
    class Meta:
        model=Test_Interface
        fields='__all__'

在这里插入图片描述

3、支持连表查询

project_create_time=serializers.CharField(source='project.create_time')

显示 一对一 或 一对多 或 多对多 字段对应的文本信息。支持连表查询

from rest_framework import serializers
from ttest.models import Test_Project,Test_Interface


class TProjectSerializer(serializers.ModelSerializer):

    class Meta:
        model=Test_Project
        fields='__all__'


class TInterfaceSerializer(serializers.ModelSerializer):
    type = serializers.ChoiceField(choices=Test_Interface.CHOICES,
                                   source="get_type_display",
                                   read_only=True)  # 设置source="get_属性_display"即可
    project_create_time=serializers.CharField(source='project.create_time')

    class Meta:
        model=Test_Interface
        fields='__all__'

在这里插入图片描述

4、自定义序列化输出方法

自定义序列化输出方法,会寻找并执行’get_xxx’的方法。

from rest_framework import serializers
from ttest.models import Test_Project,Test_Interface


class TProjectSerializer(serializers.ModelSerializer):

    class Meta:
        model=Test_Project
        fields='__all__'


class TInterfaceSerializer(serializers.ModelSerializer):
    type = serializers.ChoiceField(choices=Test_Interface.CHOICES,
                                   source="get_type_display",
                                   read_only=True)  # 设置source="get_属性_display"即可
    project_create_time=serializers.CharField(source='project.create_time')

    name_zidingyi=serializers.SerializerMethodField()
    def get_name_zidingyi(self,obj):
        return obj.project.name

    class Meta:
        model=Test_Interface
        fields='__all__'

在这里插入图片描述

5、案例5

序列化输出时改变前端输出的字段名称
在这里插入图片描述
在这里插入图片描述


在这里插入图片描述

  • 48
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 42
    评论
Django使用Dropzone,并将上传的文件与一个文件模型关联起来,您可以按照以下步骤进行操作: 1. 定义文件模型:首先,您需要定义一个文件模型来存储上传的文件的相关信息。例如,您可以在models.py文件中定义一个名为`FileModel`的模型,其中包含一个`FileField`字段用于存储上传的文件。 ```python from django.db import models class FileModel(models.Model): file = models.FileField(upload_to='uploads/') # 其他字段和方法... ``` 在上面的示例中,`upload_to`参数指定了文件上传的目录路径。 2. 创建表单:接下来,您需要创建一个表单类来处理Dropzone上传的文件。您可以使用Django的内置表单功能来定义一个表单类,并将其与文件模型关联起来。 ```python from django import forms class FileUploadForm(forms.ModelForm): class Meta: model = FileModel fields = ['file'] ``` 在上面的示例中,我们使用了`ModelForm`来定义一个表单类,并将其与`FileModel`模型关联起来。指定`fields`属性为`['file']`以仅显示文件字段。 3. 编写视图:然后,您需要编写一个视图函数来处理表单的提交和文件的保存。在视图函数中,您可以将上传的文件与文件模型进行关联,并保存到数据库中。 ```python from django.shortcuts import render def upload(request): if request.method == 'POST': form = FileUploadForm(request.POST, request.FILES) if form.is_valid(): file_instance = form.save() # 保存表单数据到数据库 # 其他操作,例如返回成功页面或其他处理 return render(request, 'upload_success.html', {'file_instance': file_instance}) else: form = FileUploadForm() return render(request, 'upload.html', {'form': form}) ``` 在上面的示例中,我们首先实例化`FileUploadForm`并传递`request.POST`和`request.FILES`作为参数。接下来,我们检查表单是否有效,如果有效则调用`form.save()`方法将数据保存到数据库中。然后,您可以执行其他操作,例如返回成功页面,并将文件实例传递给模板以进行显示或其他处理。 4. 创建模板:最后,您需要创建一个模板文件来显示上传表单和上传成功的页面。根据您的需求,您可以创建名为`upload.html`和`upload_success.html`的模板文件,并使用Django模板语法来显示表单和相关信息。 这是一个简单的示例模板代码: upload.html: ```html <form method="post" enctype="multipart/form-data"> {% csrf_token %} {{ form }} <input type="submit" value="上传"> </form> ``` upload_success.html: ```html <h2>上传成功</h2> <p>已上传文件:{{ file_instance.file.name }}</p> ``` 以上是一个基本的使用Dropzone与文件模型关联的示例。您可以根据实际需求进行修改和扩展。 希望这对您有所帮助!如果您有任何疑问,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敲代码敲到头发茂密

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值