一对一关系表查询
以员工与薪水表为例,两张表是一对一的关系,外键关系要建在薪水表中,一对一使用: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