首页 > 编程语言 >Python基础day61 Django choices参数和Ajax技术简介

Python基础day61 Django choices参数和Ajax技术简介

时间:2023-08-07 15:55:54浏览次数:37  
标签:name Python choices day61 models blank True verbose

choices参数的使用

choices是ORM中常用字段的参数

作用:

  类似于一些字段:性别、学历、客户来源、是否上学、是否结婚等有限较少选择的字段我们在表中存储的时候一般使用choices参数,用数字替代文字。

案例

class Customer(models.Model):
    """
    客户表
    """
    qq = models.CharField(verbose_name='qq', max_length=64, unique=True, help_text='QQ号必须唯一')

    name = models.CharField(verbose_name='学生姓名', max_length=16)
    gender_choices = ((1, '男'), (2, '女'))
    gender = models.SmallIntegerField(verbose_name='性别', choices=gender_choices)

    education_choices = (
        (1, '重点大学'),
        (2, '普通本科'),
        (3, '独立院校'),
        (4, '民办本科'),
        (5, '大专'),
        (6, '民办专科'),
        (7, '高中'),
        (8, '其他')
    )
    education = models.IntegerField(verbose_name='学历', choices=education_choices, blank=True, null=True, )
    graduation_school = models.CharField(verbose_name='毕业学校', max_length=64, blank=True, null=True)
    major = models.CharField(verbose_name='所学专业', max_length=64, blank=True, null=True)

    experience_choices = [
        (1, '在校生'),
        (2, '应届毕业'),
        (3, '半年以内'),
        (4, '半年至一年'),
        (5, '一年至三年'),
        (6, '三年至五年'),
        (7, '五年以上'),
    ]
    experience = models.IntegerField(verbose_name='工作经验', blank=True, null=True, choices=experience_choices)
    work_status_choices = [
        (1, '在职'),
        (2, '无业')
    ]
    work_status = models.IntegerField(verbose_name="职业状态", choices=work_status_choices, default=1, blank=True,
                                      null=True)
    company = models.CharField(verbose_name="目前就职公司", max_length=64, blank=True, null=True)
    salary = models.CharField(verbose_name="当前薪资", max_length=64, blank=True, null=True)

    source_choices = [
        (1, "qq群"),
        (2, "内部转介绍"),
        (3, "官方网站"),
        (4, "百度推广"),
        (5, "360推广"),
        (6, "搜狗推广"),
        (7, "腾讯课堂"),
        (8, "广点通"),
        (9, "高校宣讲"),
        (10, "渠道代理"),
        (11, "51cto"),
        (12, "智汇推"),
        (13, "网盟"),
        (14, "DSP"),
        (15, "SEO"),
        (16, "其它"),
    ]
    source = models.SmallIntegerField('客户来源', choices=source_choices, default=1)
    referral_from = models.ForeignKey(
        'self',
        blank=True,
        null=True,
        verbose_name="转介绍自学员",
        help_text="若此客户是转介绍自内部学员,请在此处选择内部学员姓名",
        related_name="internal_referral"
    )
    course = models.ManyToManyField(verbose_name="咨询课程", to="Course")

    status_choices = [
        (1, "已报名"),
        (2, "未报名")
    ]
    status = models.IntegerField(
        verbose_name="状态",
        choices=status_choices,
        default=2,
        help_text=u"选择客户此时的状态"
    )

    consultant = models.ForeignKey(verbose_name="课程顾问", to='UserInfo', related_name='consultanter',
                                   limit_choices_to={'depart': 1001})

    date = models.DateField(verbose_name="咨询日期", auto_now_add=True)
    recv_date = models.DateField(verbose_name="当前课程顾问的接单日期", null=True)
    last_consult_date = models.DateField(verbose_name="最后跟进日期", )

    def __str__(self):
        return self.name


class ConsultRecord(models.Model):
    """
    客户跟进记录
    """
    customer = models.ForeignKey(verbose_name="所咨询客户", to='Customer')
    consultant = models.ForeignKey(verbose_name="跟踪人", to='UserInfo', limit_choices_to={'depart': 1001})
    date = models.DateField(verbose_name="跟进日期", auto_now_add=True)
    note = models.TextField(verbose_name="跟进内容...")

    def __str__(self):
        return self.customer.name + ":" + self.consultant.name


class Student(models.Model):
    """
    学生表(已报名)
    """
    customer = models.OneToOneField(verbose_name='客户信息', to='Customer')
    class_list = models.ManyToManyField(verbose_name="已报班级", to='ClassList', blank=True)

    emergency_contract = models.CharField(max_length=32, blank=True, null=True, verbose_name='紧急联系人')
    company = models.CharField(verbose_name='公司', max_length=128, blank=True, null=True)
    location = models.CharField(max_length=64, verbose_name='所在区域', blank=True, null=True)
    position = models.CharField(verbose_name='岗位', max_length=64, blank=True, null=True)
    salary = models.IntegerField(verbose_name='薪资', blank=True, null=True)
    welfare = models.CharField(verbose_name='福利', max_length=256, blank=True, null=True)
    date = models.DateField(verbose_name='入职时间', help_text='格式yyyy-mm-dd', blank=True, null=True)
    memo = models.CharField(verbose_name='备注', max_length=256, blank=True, null=True)

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


class ClassStudyRecord(models.Model):
    """
    上课记录表 (班级记录)
    """
    class_obj = models.ForeignKey(verbose_name="班级", to="ClassList")
    day_num = models.IntegerField(verbose_name="节次", help_text=u"此处填写第几节课或第几天课程...,必须为数字")
    teacher = models.ForeignKey(verbose_name="讲师", to='UserInfo', limit_choices_to={'depart': 1002})
    date = models.DateField(verbose_name="上课日期", auto_now_add=True)

    course_title = models.CharField(verbose_name='本节课程标题', max_length=64, blank=True, null=True)
    course_memo = models.TextField(verbose_name='本节课程内容概要', blank=True, null=True)
    has_homework = models.BooleanField(default=True, verbose_name="本节有作业")
    homework_title = models.CharField(verbose_name='本节作业标题', max_length=64, blank=True, null=True)
    homework_memo = models.TextField(verbose_name='作业描述', max_length=500, blank=True, null=True)
    exam = models.TextField(verbose_name='踩分点', max_length=300, blank=True, null=True)

    def __str__(self):
        return "{0} day{1}".format(self.class_obj, self.day_num)


class StudentStudyRecord(models.Model):
    '''
    学生学习记录
    '''
    classstudyrecord = models.ForeignKey(verbose_name="第几天课程", to="ClassStudyRecord")
    student = models.ForeignKey(verbose_name="学员", to='Student')

    record_choices = (('checked', "已签到"),
                      ('vacate', "请假"),
                      ('late', "迟到"),
                      ('noshow', "缺勤"),
                      ('leave_early', "早退"),
                      )
    record = models.CharField("上课纪录", choices=record_choices, default="checked", max_length=64)
    score_choices = ((100, 'A+'),
                     (90, 'A'),
                     (85, 'B+'),
                     (80, 'B'),
                     (70, 'B-'),
                     (60, 'C+'),
                     (50, 'C'),
                     (40, 'C-'),
                     (0, ' D'),
                     (-1, 'N/A'),
                     (-100, 'COPY'),
                     (-1000, 'FAIL'),
                     )
    score = models.IntegerField("本节成绩", choices=score_choices, default=-1)
    homework_note = models.CharField(verbose_name='作业评语', max_length=255, blank=True, null=True)
    note = models.CharField(verbose_name="备注", max_length=255, blank=True, null=True)

    homework = models.FileField(verbose_name='作业文件', blank=True, null=True, default=None)
    stu_memo = models.TextField(verbose_name='学员备注', blank=True, null=True)
    date = models.DateTimeField(verbose_name='提交作业日期', auto_now_add=True)

    def __str__(self):
        return "{0}-{1}".format(self.classstudyrecord, self.student)



# 虚拟环境查看choices内的信息
if __name__ == '__main__':
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day61Djangochoices参数和Ajax.settings")
    import django
    django.setup()
    from app01 import models
    res = models.Customer.objects.filter(id=1).first()
    print(res.get_gender_display())

MTV和MVC概念

把Django框架的执行流程做分层

在Django中分的是MTV

在其他语言中分的是MVC

 

这两个本质上都是一样的

web服务器开发领域里著名的MVC模式,就是把web应用分为模型(M)、控制器(C)和视图(V)三层;

web服务器开发领域内著名的MTV模式,就是把web应用分为模型(M)、控制器(V)和视图(T)三层

Java、PHP文件名的命名是:

Login.Controller.java

Login.Controller.php

 

● M 代表模型(Model): 负责业务对象和数据库的关系映射(ORM)。
● T 代表模板 (Template):负责如何把页面展示给用户(html)。
● V 代表视图(View): 负责业务逻辑,并在适当时候调用Model和Template。
● S 代表视图(Services): 只有在业务逻辑相当复杂的时候,才分这一层,服务层,专门用来写业务逻辑

多对多的三种创建方式

多对多的关系是借助于第三张表实现的
通过一个虚拟字段创建的第三张表:authors = models.ManyToManyField(to='') # 全自动的

方式一:全自动

class Book(models.Model):
    title = models.CharField(max_length=64)
    # 全自动创建多对多的关系
    '''
        特点:第三张表不需要我们自己来创建,通过这个虚拟字段自动创建出来第三张表
             authors字段不会再表中创建出来字段
             那么以后你在查询的时候,可以使用正反向查询和那四个方法 add set remove clear
        它的劣势就是:表的扩展性很差
    '''
    # authors = models.ManyToManyField(to='Author', through='Book2Author', through_fields=('book','author'))


class Author(models.Model):
    name = models.CharField(max_length=128)
    book = models.ManyToManyField(to='Book', through='Book2Author', through_fields=('author','book'))
  through和through_fields参数是方式三使用的

方式二

# 第三张表需要我们自己手动创建,不会在自动创建了

'''
    优势:扩展性非常好
    劣势:不能使用四个方法 add set remove clear
'''
class Book2Author(models.Model):
    book = models.ForeignKey(to='Book',on_delete=models.CASCADE)
    author = models.ForeignKey(to='Author',on_delete=models.CASCADE)
    create_time = models.DateTimeField(auto_now_add=True)

方式三

# 半自动:支持正反向查询的,但是不支持那四个方法
class Book2Author(models.Model):
    book = models.ForeignKey(to='Book', on_delete=models.CASCADE)
    author = models.ForeignKey(to='Author', on_delete=models.CASCADE)
    create_time = models.DateTimeField(auto_now_add=True)

Ajax技术简介

他是属于前端的内容,不属于Python范围的,但是他必须结合后端来使用,否则没有太大的意义,因为它是把前端的数据提交到后端的

form表单来提交数据到后端,每次提交都需要刷新整个页面,用户体验感不好;

Ajax技术就是局部刷新,异步提交,他不需要刷新整个页面,只需要刷新局部的,主要就是刷新的时候是无感知的

Ajax的特点:
局部刷新
异步提交

案例:Github的注册案例

基于jquery的Ajax实现
我们知道Ajax它数js语言,所以它肯定能够使用js实现,但是,js实现太麻烦了,总共分四个步骤
我们不学学习js版本的ajax,我们学习jQuery封装之后的Ajax,把Ajax的使用表的非常简单

小案例

# 我们使用的ajax是jQuery封装之后的版本,所以,要想使用Ajax必须导入jQuery库

# 让你做一个加法运算
 // 把前端输入的值提交到后端计算
        // 问题是如何提交到后端
        // 使用ajax提交
        $.ajax({
            // 1. 指定参数提交到后端的哪个地址?
            url:'',  // 如果不写就是朝当前地址提交

            // 2. 指定以什么请求方式提交的 get post
            type:'post',

            // 3. 指定要传递的数据
            {#data: {'d1':d1, 'd2':d2},#}
            data: {d1:d1, d2:d2},
            dataType:'json',
            // 4. 回调函数,接收后端返回的数据
            success:function (res) {
                // 怎么样反序列化?
                {#console.log(res);#}
                {#console.log(typeof res);#}
                {#console.log(res.code);#}

                {#res= JSON.parse(res) // 对象#}
                console.log(res)
                console.log(typeof res)
                console.log(res.code)
                console.log(res.msg)
                console.log(res.data)
                console.log(res.data.username)


                {#$("#d3").val(res);#}
            }
        })
                    
                    
总结:
     1. 后端如果使用return JsonResponse(d), 前端不用反序列化,直接当成对象使用
     2. 后端使用return HttpResponse(res),前端需要自己反序列化:res= JSON.parse(res)
     3. 后端使用return HttpResponse(res),前端不反序列化,需要指定参数:dataType:'json'   

 

标签:name,Python,choices,day61,models,blank,True,verbose
From: https://www.cnblogs.com/zfq132/p/17611654.html

相关文章

  • 一招让你的Python爬虫事半功倍
    在Python爬虫的世界里,你是否也被网站的IP封锁问题困扰过?别担心,我来教你一个简单而又有效的爬虫ip设置方法,让你的爬虫畅行无阻!快来跟我学,让你的Python爬虫事半功倍,轻松搞定IP封锁问题!首先,我们来了解一下爬虫ip是什么?爬虫ip:爬虫ip是指通过中间服务器转发请求并获取响应的一种技术手段......
  • 使用python,利用公网服务器时间更新windows本地时间
    有时候,我们会发现无法连接windows的时间服务器或者内网的时间服务器本身的时间不准。于是,可以通过如下python脚本示例,从公网任意服务器获取其服务器时间,这样更新的时间较为准确。#-*-coding:utf-8-*-importdatetimeimportsubprocessimportrequestsimporttimedefset_......
  • python re将字符串中的数字乘二
    importredefdouble(matched):value=int(matched.group('value'))returnstr(value*2)s='A23G4HFD567'print(re.sub('(?P<value>\d+)',double,s))#1.?P<value>的意思就是命名一个名字为value的组,匹配规则符合后面的/d+#......
  • choices参数的使用
    choices参数的使用choices它是ORM中常用字段中的参数 作用:针对于一些字段它的情况能够被列举完,像这样的字段,我们在表中存储的时候一般使用choices参数案例classCustomer(models.Model):"""客户表"""qq=models.CharField(verbose_name='qq',max_len......
  • 一招让你的Python爬虫事半功倍
    在Python爬虫的世界里,你是否也被网站的IP封锁问题困扰过?别担心,我来教你一个简单而又有效的爬虫ip设置方法,让你的爬虫畅行无阻!快来跟我学,让你的Python爬虫事半功倍,轻松搞定IP封锁问题!首先,我们来了解一下爬虫ip是什么?爬虫ip:爬虫ip是指通过中间服务器转发请求并获取响应的一种技术手段......
  • python esp32 json pyserial
    esp32:#include<ArduinoJson.h>voidsetup(){Serial.begin(9600);}voidloop(){if(Serial.available()){//读取串口输入的数据StringjsonString=Serial.readStringUntil('\n');//创建JSON文档StaticJsonDocument<300>......
  • python 获取本机IP(公网,局域网)
    获取公网IP1importrequests2importre3res=requests.get("https://myip.ipip.net",timeout=5).text4ip=re.findall(r'(\d+\.\d+\.\d+\.\d+)',res)[0]5print(ip)获取局域网IP1importsocket23res=socket.gethostbyname(socket.g......
  • PEP 703作者给出的一种no-GIL的实现——python3.9的nogil版本
    PEP703的内容是什么,意义又是什么呢?可以说python的官方接受的no-GIL提议的PEP就是PEP703给出的,如果GIL帧的从python中移除那么可以说对整个python生态圈将有着跨越性发展的意义。  ====================================================  PEP703地址:https://peps.python.org......
  • ChatGPT 作为 Python 编程助手
    推荐:使用NSDT场景编辑器助你快速搭建可编辑的3D应用场景简单的数据处理脚本我认为一个好的起点是某种数据处理脚本。由于我打算让ChatGPT之后使用各种Python库编写一些机器学习脚本,这似乎是一个合理的起点。目标首先,我想尝试加载数据集;确保所有数据集值都是数值,或将其转......
  • python爬虫之scrapy框架介绍
    一、Scrapy框架简介Scrapy是一个开源的Python库和框架,用于从网站上提取数据。它为自从网站爬取数据而设计,也可以用于数据挖掘和信息处理。Scrapy可以从互联网上自动爬取数据,并将其存储在本地或在Internet上进行处理。Scrapy的目标是提供更简单、更快速、更强大的方式来从网......