day66 django进阶(2)

一、choices参数(数据库字段设计常见)

这个参数是针对一些我们可以列举完全可能性的字段的记录

例如:性别,学历,工作经验,是否结婚,是否独生子女

# models.py

class User(models.Model):
    name = models.CharField(max_length=32)
    sex_choise=((1,'男'),(2,'女'))
    sex = models.IntegerField(choices=sex_choise)



# test.py

user_obj = models.User.objects.create(name='hz',sex=1)
print(user_obj.sex) # 1
print(user_obj.get_sex_display()) # 男

user_obj = models.User.objects.create(name='lxt',sex=3)
print(user_obj.sex) # 3
print(user_obj.get_sex_display()) # 3

总结:在使用chocies的时候先要在要写的字段前加上对应关系,在存数据的时候存对应关系的第一个,取的时候功通过getxxxdisplay的方法得到对应关系,如果没有这个对应关系,存什么就得到什么

二、MTV与MVC模型

django号称MTV模型,本质上也是MCV模型

MTV:

  • M:models
  • T:templates
  • V:views

MVC:

  • M:models
  • V:views
  • C:controller(类似url.py)

vue框架:MVVM模型

三、多对多三种创建方法

1 全自动

利用orm自动帮我们创建第三张关系表

class Book(models.Model):
    name = models.CharField(max_length=32)
    authors = models.ManyToManyField(to='Author')
class Author(models.Model):
    name = models.CharField(max_length=32)

优点:创建第三张关系表的代码不需要写,还支持orm提供的第三张的操作,add,set,remove,clear

缺点:第三张表扩展性差,不能额外添加字段

2 纯手动

自己写第三张关系表

class Book(models.Model):
    name = models.CharField(max_length=32)
    
class Author(models.Model):
    name = models.CharField(max_length=32)
  
 class Book2Author(models.Model):
    book_id = models.ForeignKey(to='Book')
    author_id = models.ForeignKey(to='Author')

优点:第三张表扩展性好

缺点:要写的代码多,不能使用orm提供的简单的方法

3 半自动

自己写表的同时,主动关联和第三张表的关系

class Book(models.Model):
    name = models.CharField(max_length=32)
    authors = models.ManyToManyField(to='Author',
                                     through='Book2Author',
                                     through_fields=('book','author')
                                     )
    # 这个外键字段非常见名知意,to=外键关联的表,through=通过哪个表把两者相连,through_fields=(‘第三张表字段1’,‘第三张表字段2’) 这个顺序不能乱
class Author(models.Model):
    name = models.CharField(max_length=32)
    
class Book2Author(models.Model):
    book = models.ForeignKey(to='Book')
    author = models.ForeignKey(to='Author')

优点:扩展性好,切能使用orm的正反向查询

缺点:但是不能使用add,set,remove,clear方法

总结:掌握半自动和全自动,为了扩展性一般使用半自动

四、AJax

特点:异步提交,局部刷新

例子:当我们在一些网站的注册页面,输入密码长度必须大于7位,这个时候我们密码如果没有大于7位,框外一直有一个×,当我们位数超过7位,×会立刻变成√,但是页面本身没有刷新,我们也没有提交数据,只是局部刷新了。

朝服务端发送请求的方式:

  • 浏览器地址直接输入url回车:GET请求
  • a标签href属性:GET请求
  • form表单的method属性:GET/POST
  • ajax:GET/POST

注意:AJAX 不是新的编程语言,而是一种使用现有标准的新方法(比较装饰器)

优点:是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。(这一特点给用户的感受是在不知不觉中完成请求和响应过程)

Ajax我们只学习jQuery封装之后的版本(不学原生的 原生的复杂并且在实际项目中也一般不用),所以在前端页面使用ajax必须要导入jQuery

小🌰

"""
页面上有三个input框
	在前两个框中输入数字 点击按钮 朝后端发送ajax请求
	后端计算出结果 再返回给前端动态展示的到第三个input框中
	(整个过程页面不准有刷新,也不能在前端计算)
"""
$('#btn').click(function () {
        // 朝后端发送ajax请求
        $.ajax({
            // 1.指定朝哪个后端发送ajax请求
            url:'', // 不写就是朝当前地址提交
            // 2.请求方式
            type:'post',  // 不指定默认就是get 都是小写
            // 3.数据
            {#data:{'username':'jason','password':123},#}
            data:{'i1':$('#d1').val(),'i2':$('#d2').val()},
            // 4.回调函数:当后端给你返回结果的时候会自动触发 args接受后端的返回结果
            success:function (args) {
                {#alert(args)  // 通过DOM操作动态渲染到第三个input里面#}
                {#$('#d3').val(args)#}
                console.log(typeof args)

            }
        })
    })
'''
针对后端如果是用HttpResponse返回的数据 回调函数不会自动帮你反序列化
如果后端直接用的是JsonResponse返回的数据 回调函数会自动帮你反序列化

如果用的HttpResponse就要自己在前端用JSON.parse()反序列化,或者ajax里配置一个参数
'''
posted @ 2020-06-02 22:15  lxttt521  阅读(177)  评论(0编辑  收藏  举报