choices参数(数据库字段设计常见)
""" 用户表 性别 学历 工作经验 是否结婚 是否生子 客户来源 ... 针对某个可以列举完全的可能性字段,我们应该如何存储 只要某个字段的可能性是可以列举完全的,那么一般情况下都会采用choices参数 """ class User(models.Model): username = models.CharField(max_length=32) age = models.IntegerField() # 性别 gender_choices = ( (1,'男'), (2,'女'), (3,'其他'), ) gender = models.IntegerField(choices=gender_choices) score_choices = ( ('A','优秀'), ('B','良好'), ('C','及格'), ('D','不合格'), ) # 保证字段类型跟列举出来的元祖第一个数据类型一致即可 score = models.CharField(choices=score_choices,null=True) """ 该gender字段存的还是数字 但是如果存的数字在上面元祖列举的范围之内 那么可以非常轻松的获取到数字对应的真正的内容 1.gender字段存的数字不在上述元祖列举的范围内容 2.如果在 如何获取对应的中文信息 "" from app01 import models # models.User.objects.create(username='jason',age=18,gender=1) # models.User.objects.create(username='egon',age=85,gender=2) # models.User.objects.create(username='tank',age=40,gender=3) # 存的时候 没有列举出来的数字也能存(范围还是按照字段类型决定) # models.User.objects.create(username='tony',age=45,gender=4) # 取 # user_obj = models.User.objects.filter(pk=1).first() # print(user_obj.gender) # 只要是choices参数的字段 如果你想要获取对应信息 固定写法 get_字段名_display() # print(user_obj.get_gender_display()) user_obj = models.User.objects.filter(pk=4).first() # 如果没有对应关系 那么字段是什么还是展示什么 print(user_obj.get_gender_display()) # 4
MTV与MVC模型
# MTV:Django号称是MTV模型 M:models T:templates V:views # MVC:其实django本质也是MVC M:models V:views C:controller # vue框架:MVVM模型
多对多三种创建方式
# 全自动:利用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提供操作第三张关系表的方法... 不足之处:第三张关系表的扩展性极差(没有办法额外添加字段...) """ # 纯手动 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提供的简单的方法 不建议你用该方式 ''' # 半自动 class Book(models.Model): name = models.CharField(max_length=32) authors = models.ManyToManyField(to='Author', through='Book2Author', through_fields=('book','author') ) class Author(models.Model): name = models.CharField(max_length=32) # books = models.ManyToManyField(to='Book', # through='Book2Author', # through_fields=('author','book') # ) class Book2Author(models.Model): book = models.ForeignKey(to='Book') author = models.ForeignKey(to='Author') """ through_fields字段先后顺序 判断的本质: 通过第三张表查询对应的表 需要用到哪个字段就把哪个字段放前面 你也可以简化判断 当前表是谁 就把对应的关联字段放前面 半自动:可以使用orm的正反向查询 但是没法使用add,set,remove,clear这四个方法 """ # 总结:为了扩展性更高 一般我们都会采用半自动(写代码要给自己留一条后路)
Ajax
""" 异步提交 局部刷新 例子:github注册 动态获取用户名实时的跟后端确认并实时展示的前端(局部刷新) 朝发送请求的方式 1.浏览器地址栏直接输入url回车 GET请求 2.a标签href属性 GET请求 3.form表单 GET请求/POST请求 4.ajax GET请求/POST请求 AJAX 不是新的编程语言,而是一种使用现有标准的新方法(比较装饰器) AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。(这一特点给用户的感受是在不知不觉中完成请求和响应过程) Ajax我们只学习jQuery封装之后的版本(不学原生的 原生的复杂并且在实际项目中也一般不用) 所以我们在前端页面使用ajax的时候需要确保导入了jQuery ps:并不只有jQuery能够实现ajax,其他的框架也可以 但是换汤不换药 原理是一样的 """
小例子
""" 页面上有三个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解决方式 1.自己在前端利用JSON.parse() 2.在ajax里面配置一个参数 (后面再讲) """
标签:models,gender,字段,choices,Ajax,参数,Model,class From: https://www.cnblogs.com/py1234/p/16867723.html