Django-数据库操作(model与views)-1

1、数据库操作创建数据

1.1在view.py中get方法下,创建数据

from django.db import connection
在debug调试时,加入connection.queries
Django-数据库操作(model与views)-1

    def get(self, request, pk):
        # 一。创建数据
        # 1、创建一条项目数据
        # 方法1 直接使用模型类来创建模型对象
        # one_project = Project(name='XXX项目', leader='xx人', desc='描述')
        # one_project.save()
        # 方法二
        Project.objects.create(name='YYY',leader='yy',desc='这是YYY项目')  # 方法一的整合
        return HttpResponse('')

1.2数据库父表中创建字段

class Project(BaseModel):

    # 一个数据库模型类中只允许定义一个设置了primary_key=True的字段
    # CREATE TABLE "project_people" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
    # "name" varchar(20) NOT NULL, "age" integer NOT NULL)
    #  id为主键约束 要想使得其他字段为为主键约束,id就不会成主键
    # num = models.IntegerField(primary_key=True)
    # CharField指定varchar类型,必须设置max-length参数,指定最大长度
    # verbose_name和help_text指定的中文描述,在admin后台站点以及接口文档平台中会使用
    # unique=True设置唯一约束,默认为False
    name = models.CharField(verbose_name='项目名称', help_text='项目名称1', max_length=20,
                            unique=True)
    leader = models.CharField(verbose_name='项目名称', help_text='项目名称1', max_length=10)
    # default=True指定当前字段的默认值
    is_execute = models.BooleanField(verbose_name='项目是否开展', help_text='项目名称1', default=True)
    # null指定当前字段是否允许保存为空
    # blank指定前端创建数据时是否允许不输入
    desc = models.TextField(verbose_name='项目描述', help_text='项目描述', null=True,
                            blank=True)
    # DateTimeField指定时间的类型
    # auto_now_add=True在创建一条数据时,会自动将当前时间赋值给creatr_time,只会修改一次
    # auto_now=True,每次更新数据时,会自动将当前时间赋值给update_time,只要修改,就会自动保存
    create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间', help_text='创建时间')
    update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间', help_text='更新时间')
    
    class Meta:

        db_table = 'tb_project'
        verbose_name = '项目表'
        verbose_name_plural = '项目表'
        managed = True

1.3数据库表中创建表,关联父表

from django.db import models


# Create your models here.
# 表于表之间的关联关系
# Project与Interfaces表,一对多关系
# 学生表与学生详细信息表,一对一关系
# 学生表和课程表,多对多关系
# 一条项目数据:ID为1的测试开发平台项目
# 多年条接口数据:ID为1的登陆接口,ID为2的注册接口,ID为3的生成用例接口。
class Interfaces(models.Model):
    # id = models.AutoField(primary_key=True, verbose_name='id主键', help_text='id主键')
    name = models.CharField(verbose_name="接口名称", help_text='接口名称', max_length=20, unique=True)
    tester = models.CharField(verbose_name="测试人员", help_text='测试人员', max_length=20)
    # 1、可以使用ForeignKey在从表中指定外键字段,在一对多关系中"多"的那侧添加外键字段
    # 2、ForeignKey第一个参数,需要指定关联父表,往往使用"子应用名.父表模型类名"1
    # 3、必须指定on_delete级联删除策略
    # 4、级联删除策略有如下种类
    # CASCADE:当父表数据删除后,从表数据会自动删除
    # SET_NULL: 当父表数据删除后,从表数据字段自动设置null
    # PROTECT: 当父表数据删除后,从表数据会抛出异常
    # SET_DEFAULT:当父表数据删除后,从表数据外键字段会自动设置为default参数指定值
    # project = models.ForeignKey('project.Project', on_delete=models.PROTECT)
    # project = models.ForeignKey('project.Project', on_delete=models.SET_NULL)
    # 创建数据表时,会自动添加project_id为字段名称,用于存放父表的外键值
    # ForeignKey一对多 OneToOneFiled一对一 ManyToMany多对多
    # desc = models.TextField(verbose_name='项目描述', help_text='项目描述', null=True,
    #                         blank=True)
    project = models.ForeignKey('project.Project', on_delete=models.CASCADE)  # CASCADE()不能带括号,当函数用
    create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间', help_text='创建时间')
    update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间', help_text='更新时间')

    class Meta:
        db_table = 'tb_interfaces'
        verbose_name = '接口表'
        verbose_name_plural = '接口表'

    # def __str__(self):
    #     return self.name

1.4通过views.py,进行数据库操作

from django.http import HttpResponse
from django.shortcuts import render
from django.views import View
from .models import Project
from interfaces.models import Interfaces
# Create your views here.
from django.views import View
from django.db import connection  # 为了调试的时候查看sql语句


def index(request, pk):
    return HttpResponse(f'这是pk为{pk}的参数')


def index2(request):
    return HttpResponse('结束')


class ProjectViews(View):
    """
    定义类是图
    1、必须继承View父类,或者子类
    2、不同的请求方式,定义不同的请求方式
    3、请求方式与请求定义一一对应
    """

    def get(self, request, pk):
        """
        1、第一个参数为ProjectViews对象
        :param request:
        :param pk:
        :return:
        1、query string 查询字符串参数: ?name='xiao'&age=12
        可以使用request.GET进行获取,request.GET是QueryDict类型,可以类比python中的字典类型
        可以使用request.GET['参数名']或者request.GET.get('参数名')
        可以获取多个相同key值查询字符串参数
        request.GET.getlist('参数名')获取所有参数
        用request.GET['参数名']或者request.GET.get('参数名')获取最后一个参数
        """
        # 一。创建数据
        # 1、创建一条项目数据
        # 方法1 直接使用模型类来创建模型对象
        # one_project = Project(name='XXX项目', leader='xx人', desc='描述')
        # one_project.save()
        # 方法二
        # one_project = Project.objects.create(name='Y111', leader='yy', desc='这是YYY项目')  # 方法一的整合
        # 添加子表数据
        # one_interfaces = Interfaces.objects.create(name='登陆把', tester='yy', desc='登陆', project_id=one_project.id)
        # 同下一行
        # one_interfaces = Interfaces.objects.create(name='登1', tester='yy', project=one_project)
        # 子应用名称.objects.create

        # 二、更新数据
        # 方法一:
        # 所有的模型类都有一个objects属性,是一个manage对象
        # 获取所需修改模型类对象,重些相应的字段
        # 必须执行save()方法。进行保存,查看debug中的sql语句,查看数据库 即已更新
        # one_project = Project.objects.get(name='Y111')
        # one_project.name = '更改名称'
        # one_project.save()
        # 方法二:
        # 先将待修改的数据提取出来。然后用update方法,无需调用save()方法。
        # qs = Project.objects.filter(name='更改名称').update(leader='zha zha')

        # 三 、读取数据
        # 方式一:
        # 1、查询多条数据
        # 使用模型类object.all() 返回QuerySet对象类似列表,但不是列表
        # 惰性查找:只有需要用到数据时(len,取值,for),才会执行sql语句
        # project_ps = Project.objects.all()
        # for project in project_ps:
        #     print(project.name)

        # 读取一条数据
        # con_pro = Project.objects.get(id=1)
        # 只能查一条或者为空,查的结果超过一条,会报错。要避免错误,最好用ID
        # 方式二:
        # one_pro = Project.objects.filter(id=1)
        # 返回QuerySet对象   不会报错,有就有数据,没有展示为空
        return HttpResponse('')

    def post(self, request, pk):
        return HttpResponse(f'POST请求:PK为{pk}')

    def put(self, request, pk):
        return HttpResponse(f'PUT请求:PK为{pk}')

上一篇:django离线插入测试数据


下一篇:Building deep retrieval models