第四十五章:djanggo ORM补充

时间:2022-05-16 14:30:01
- 一对一
  
  列子:
   
   用户表(母表):
    id    name   age  
    1     zekai   18
   
  
   
   薪水表(子表):
    id    money   us_id
     1      2000     1   (只能出现一次)
  
  class UserInfo(models.Model):
   name = models.CharField(max_length=32)
   age = models.CharField(max_length=32)
   
  
  class Salary(models.Model):
   money = models.CharField(max_length=32)
   us = models.OneToOneField("UserInfo")
  
  
  一对一查询:
   ### 查询:
   ## 正向查询(子表查母表):
   ### 1.11.22 :res.us.name
   ### 1.11.10 : res.母表表名小写.name
   res = models.Salary.objects.filter(money="3000").first()
   print(res.us.name)

   ### 反向查询(母表查子表)
   ### obj.子表小写.子表列名 : res.salary.money
   res = models.UserInfo.objects.filter(name='zekai').first()
   print(res.salary.money)
  
  
  - django列类型  (***************************************************)
   
      mysql             django
       
      tinyint           无
      smallint(unsigned)     SmallIntegerField (PositiveSmallIntegerField)
    数字 int (unsigned))          IntegerField   (PositiveIntegerField)
      mediumint            无
      bigint(unsigned)         BigIntegerField
      
      float                                  FloatField
      decimal(5,2) : 200.23                  DecimalField
      
      
      char                                     无
    字符串 varchar                               CharFiled
      text         TextField
      
      
    时间     datetime (2019-7-17 12:23:34)    DateTimeField  
       date      (2019-7-17)              DateField
      
      
     - 参数:
      max_length=32
      null=True  : 可以设置为null
      db_index=True : 设置索引
      default : 设置默认值
      unique : 设置唯一索引
       
      db_column: 设置一个列名
      
      unique_together: 联合唯一索引
      index_together :普通联合索引
       class Meta:
        unique_together = (
         ('money', 'us_id'),
         ....
        )
        index_together = (
         ('money', '')
         ....
        )
   
 
-----------------------------------------------------------------------
djagno-admin:
 django自带的管理后台系统
  命令生成:
   python3 manage.py  createsuperuser
 想要管理自己生成的表:
  admin.py:
   from app01 import models
   admin.site.register(models.UserInfo)
  
 
  django-admin中的列类型:
   EmailField(CharField):
    - 字符串类型,Django Admin以及ModelForm中提供验证机制
   IPAddressField(Field)
    - 字符串类型,Django Admin以及ModelForm中提供验证 IPV4 机制
   GenericIPAddressField(Field)
    - 字符串类型,Django Admin以及ModelForm中提供验证 Ipv4和Ipv6
    - 参数:
     protocol,用于指定Ipv4或Ipv6, 'both',"ipv4","ipv6"
     unpack_ipv4, 如果指定为True,则输入::ffff:192.0.2.1时候,可解析为192.0.2.1,开启刺功能,需要protocol="both"
   URLField(CharField)
    - 字符串类型,Django Admin以及ModelForm中提供验证 URL
   SlugField(CharField)
    - 字符串类型,Django Admin以及ModelForm中提供验证支持 字母、数字、下划线、连接符(减号)
   CommaSeparatedIntegerField(CharField)
    - 字符串类型,格式必须为逗号分割的数字
   UUIDField(Field)
    - 字符串类型,Django Admin以及ModelForm中提供对UUID格式的验证
   FileField(Field)
 
  djagno-admin中的参数 :
   verbose_name        Admin中显示的字段名称       
 
   blank               Admin中是否允许用户输入为空
   editable            Admin中是否可以编辑
   help_text           Admin中该字段的提示信息
   choices             Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作
   choices = (
    (1, '男'),
    (2, '女')
   )
   gender = models.IntegerField(choices=chocies)
   
   id name  gender (男女)
   
   
  
 
 2.分页
  - djagno内置分页
  
   
  
  - 自定制分页
 
 
 
 
 
 3.CSRF攻击
  
  Xss: 跨站脚本攻击
   
  CSRF:跨站请求伪造
  
  
   - 开启全局的csrf验证
    1. settings中,打开注释 'django.middleware.csrf.CsrfViewMiddleware',
    2. 表单中,开启csrf_token
     <form>
      {% csrf_token %}
      <input type='text'>
     </form>
    如上, 全站都会进行csrf验证
   
   
   - 关闭部分的csrf验证:
    
    1. settings中,打开注释 ====》'django.middleware.csrf.CsrfViewMiddleware',
    2. views中,引入如下函数
     from django.views.decorators.csrf import csrf_exempt
     
     @csrf_exempt
     def csrf1(request):
      if request.method == 'GET':
       return render(request, 'csrf1.html')
      else:
       return HttpResponse('ok')
    如上, 即便全局开启验证,但是可以使用装饰器进行特殊处理,不使用
   
   
   
   - 开启部分的CSRF验证:
    
    1. settings中,注释 ====》#'django.middleware.csrf.CsrfViewMiddleware',
    2. views中,引入如下函数
     from django.views.decorators.csrf import csrf_protect
     
     @csrf_protect
     def csrf1(request):
      if request.method == 'GET':
       return render(request, 'csrf1.html')
      else:
       return HttpResponse('ok')
    如上, 即便全局关闭验证,但是可以使用装饰器进行特殊处理
   
  
   CBV:
    若是CBV:
     from django.utils.decorators import method_decorator
     @method_decorator(csrf_protect, name='get')
     class User(View):
      def get(self, request):
       pass
      def post(self, request):
       pass
   ajax:
    csrftoken = $('input[name="csrfmiddlewaretoken"]').val()
    $.ajax({
     type:"POST",
     url : '/xxxx/',
     data: {"name":'xxxx'},
     headers : {'X-CSRFToken': token},
     success: function(){
      console.log(data)
     }
    })