jango下一对一对应查询,django列类型,分页,CSR攻击

一对一关系表查询

以员工与薪水表为例,两张表是一对一的关系,外键关系要建在薪水表中,一对一使用:OneToOneField("") 括号内填入被关系表名。

        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")
        

正向查询:

res = models.Salary.objects.filter(money="3000").first()
            print(res.us.name)

反向查询:

res = models.UserInfo.objects.filter(name=‘zekai‘).first()
            print(res.salary.money)

django 列类型

数据类型可以与MySQL做对比,有许多相似的类型:

    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

Django常见参数:

- 参数:
                        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‘, ‘‘)
                                    ....
                                )
            

Django admin

admin是Django自带的管理系统

命令生成:

python3 manage.py  createsuperuser

如果想要关林自己生成的表:

    admin.py:
            from app01 import models
            admin.site.register(models.UserInfo)

dango admin中的列类型:

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 (男女)
            

分页

分页是将从数据库中查找到的数据分批次展示给用户看,如过数据有成千上万条,不做分页处理的话,给用户的用户体验极差。

分页与MySQL中的分页相似,开始位置为当前页数减去一在在乘单页展示的数据量。结束位置为当前页数乘单页展示量。

子定制分页:

1  导入我们 的mypage模块

2 通过get方法得到当前页数,使用.count 方法得到表中的总数据量

3  传入我们自己定制的类中,得到页数,和做展示的具体判断。

4 调用类中的start和end方法对取出的数据进行切片

5 将我们操作出来的数据传到前台进行模板渲染

6 在前台写入 {{page.page_html|safe}}  page_html 是我们在类中条件满足后得到的html语句。

操作案例:

from xx import mypage
current_page = request.GET.get(‘page‘)
        all_count = models.students.objects.count()
        page_obj = mypage.Pagination(current_page=current_page, all_count=all_count)
        page_list = models.students.objects.all()[page_obj.start:page_obj.end]
        classes = app01.classes.objects.all()
        return render(request, ‘students.html‘, {‘students‘:page_list,"page":page_obj,‘classes‘:classes})

CSRF攻击

全称为跨站请求伪造

CSRF攻击指的是 当我们在在同一浏览器中先是访问了授信网站,在没有退出的情况下,又访问了没有守信的网站,恰好被被某块内容或者图片吸引点了进去,这时候我们就有可能被黑客得到我们的个人登录信息,得到后就可以模拟我们对授信网站进行操作,如果之前我们访问的是银行网站,那完蛋了,你的钱就可能不见了。这样的网络攻击就被称为CSRF攻击。

解决办法是,开启CSRF验证,在djngo中是通过settings中的‘django.middleware.csrf.CsrfViewMiddleware‘来控制的,开启的话只要将注释打开即可,当我们开启后有些功能不想被控制的话,加上一个装饰器就好了。

在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的话:

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请求数据的话:

ajax:
csrftoken = $(‘input[name="csrfmiddlewaretoken"]‘).val()
$.ajax({
type:"POST",
url : ‘/xxxx/‘,
data: {"name":‘xxxx‘},
headers : {‘X-CSRFToken‘: token},
success: function(){
console.log(data)
}
})

原文地址:https://www.cnblogs.com/1624413646hxy/p/11209932.html

时间: 2024-10-10 01:30:49

jango下一对一对应查询,django列类型,分页,CSR攻击的相关文章

DJango一对一查询,ORM 列类型及列参数

一对一查询 表的创建 # 通过 OneToOneField 创建一对一的关系 from django.db import models # Create your models here. class StaffInfo(models.Model): name = models.CharField(max_length=32, null=True) age = models.CharField(max_length=32, null=True) class Salary(models.Model

mybatis的动态sql编写以及一对一关系查询和一对多的查询

创建mybatis数据库,运行以下sql语句 /* SQLyog Ultimate v8.32 MySQL - 5.5.27 : Database - mybatis ********************************************************************* */ /*!40101 SET NAMES utf8 */; /*!40101 SET SQL_MODE=''*/; /*!40014 SET @[email protected]@UNIQU

MySql学习 (一) —— 基本数据库操作语句、三大列类型

在使用MySql的时候,基本都是用图形化工具,如navicat.最近发现连最基本的创建表的语法都快忘了... 所以,想要重新系统性的学习下MySql,为后面学习MySql的一些高级查询,MySql性能和SQL语句的优化等打个基础. 用博客来记录下学习的过程,方便以后查阅和加强记忆.有错误的地方还请指出! 一.MySql的基本操作命令 注: <>表示参数.[]表示可选项 连接数据库:mysql> mysql -u<username> -p<password>; 显示

MyBaits一对一的查询方法

MyBaits一对一的查询方法 一:表数据与表结构 CREATE TABLE teacher( t_id INT PRIMARY KEY AUTO_INCREMENT, t_name VARCHAR(20) ); CREATE TABLE class( c_id INT PRIMARY KEY AUTO_INCREMENT, c_name VARCHAR(20), teacher_id INT ); ALTER TABLE class ADD CONSTRAINT fk_teacher_id F

django models 类型整理 version:1.8.3

django models 类型整理 version:1.8.3 网上百度到的最上面的一篇已经是11年的了,django变化很大,现在把1.8.3版的models类型大致整理了下贴出来 普通键部分 Field Params in database attention AutoField **options integer 在django代码内是自增 BooleanField **options boolean\bit   BinaryField [**options] blob   BigInt

django model 类型

Django 通过 models 实现数据库的创建.修改.删除等操作,本文为模型中一般常用的类型的清单,便于查询和使用: AutoField:一个自动递增的整型字段,添加记录时它会自动增长.你通常不需要直接使用这个字段:如果你不指定主键的话,系统会自动添加一个主键字段到你的model.(参阅自动主键字段) BooleanField:布尔字段,管理工具里会自动将其描述为checkbox. CharField:字符串字段,单行输入,用于较短的字符串,如要保存大量文本, 使用 TextField,Ch

MySQL数据库8(七)列类型

列类型 整数类型 tinyint 迷你整型,系统采用一个字节来保存的整型,一个字节=8byte,最大能表示的数据是0-255. smallint 小整型,系统采用两个字节来保存的整型,能表示0-65535之间的整型 mediumint 中整型,采用三个字节来保存数据 int 整型,(标准整型),采用四个字节来保存数据. bigint 大整型,采用八个字节来保存数据. 实际应用中,应该根据对应的数据范围来选定对应的整型类型,通常使用的比较多的是tinyint和int. 无符号标识设定 无符号,表示

一些列类型还有属性

列类型 数值型 int tinyint 1字节 -128 127 smallint 2字节 mediumint 3字节 int 4字节 bigint 8字节 unsigned 表示无符号位 小数型 float 4字节 38 double 8字节 308 decimal货币型 decimal(m,d) md最大65 d最大是30 整数35 字符串 char() 默认是1,最大取值255 varchar 最大值是65535个字符 实际能存储的字符的个数: 1.字符集, 2.MySQL一条记录长度65

数据表的列类型

列类型 文本类型 enum(枚举类型) 语法: enum(值列表); 说明: 值是使用逗号分隔多个值 值列表中的值的个数最多是65535个 作用是规范数据,节省空间. 类比于form表单中的单选按钮 示例: 示例: 原理: ???? set集合类型 语法: ????set(值列表); 说明: 值是使用逗号分隔多个值 值列表中的值的个数最多是64个 作用是规范数据,节省空间. 类比于form表单中的多选按钮 字段的数据型是一个字符串,相当于将值列表中的多个值拼接成一个字符串,值的顺序可以是任意 示