创建数据
objs [ models.Boy(name 刘备 ), models.Boy(name 关羽 ), models.Boy(name 张飞 ), models.Boy(name 赵云 ) models.Boy.objects.bulk_create(objs) objs [ models.Girl(nick 小赵 ), models.Girl(nick 小钱 ), models.Girl(nick 小孙 ), models.Girl(nick 小李 ) models.Girl.objects.bulk_create(objs)
创建关联
models.Love.objects.create(b_id 1, g_id 1) models.Love.objects.create(b_id 1, g_id 4) models.Love.objects.create(b_id 2, g_id 4) models.Love.objects.create(b_id 2, g_id 2)
查找和刘备有关的姑娘
# 1. 和刘备有关的姑娘 obj models.Boy.objects.filter(name 刘备 ).first() love_list obj.love_set.all() for row in love_list: print(row.g.nick) love_list models.Love.objects.filter(b__name 刘备 ) for row in love_list: print(row.g.nick) love_list models.Love.objects.filter(b__name 刘备 ).values( g__nick ) for item in love_list: print(item[ g__nick ]) love_list models.Love.objects.filter(b__name 刘备 ).select_related( g ) for obj in love_list: print(obj.g.nick)
防止男女生多次约会
class Love(models.Model):
b models.ForeignKey(to Boy , on_delete models.DO_NOTHING)
g models.ForeignKey(to Girl , on_delete models.DO_NOTHING)
class meta:
unique_together {
( b , g ),
另一种不用自己创建 Love 表的方法
class Boy(models.Model): name models.CharField(max_length 32) m models.ManyToManyField( Girl )
对 m 表的操作
obj models.Boy.objects.filter(name 刘备 ).first() obj.m.add(1) obj.m.add(2, 3) obj.m.add(*[4,]) obj.m.remove(1) obj.m.remove(2, 3) obj.m.remove(*[4,]) obj.m.set([1,]) girl_list obj.m.all() # 获取到的是所有 Girl 对象 obj.m.clear()
再或者结合在一起使用
m models.ManyToManyField( Girl , through Love , through_fields ( b , g ))CSRF
跨站请求伪造 Cross-site request forgery
使用方法基本应用
form 表单中添加 {% csrf_token %}
全站禁用
# ‘django.middleware.csrf.CsrfViewMiddleWare’,
局部禁用
from django.views.decorators.csrf import csrf_exempt
csrf_exempt
def function(request):
…
局部使用
from django.views.decorators.csrf import csrf_protect
csrf_protect
def function(request):
…
from django.utils.decorators import method_decorator
在指定方法上添加
class Foo(View):
method_decorator(wrapper)
def get(self, request):
…
或者加在类外
method_decorator(wrapper, name ‘post’)
class Foo(View):
def post(self, request):
…
直接添加多个
method_decorator(wrapper, name ‘dispatch’)
class Foo(View):
def post(self, request):
…
而对于 csrf 只能加在类上。
Ajax 请求Ajax 提交数据时 携带 CSRF 的一种方式 数据方式提交
body
form method post action /csrf1.html
{% csrf_token %}
input id user type text name user
input type submit value 提交
a onclick submitForm(); Ajax提交 /a
/form
script src http://ajax.aspnetcdn.com/ajax/jquery/jquery-1.12.4.min.js /script
script
function submitForm() {
var csrf $( input[name csrfmiddlewaretoken ] ).val();
var user $( #user ).val();
$.ajax({
url: /csrf1.html ,
type: POST ,
data: { user : user},
success: function (arg) {
console.log(arg);
/script
/body
另一种方式 放在请求头中
body
form method post action /csrf1.html
{% csrf_token %}
input id user type text name user
input type submit value 提交
a onclick submitForm(); Ajax提交 /a
/form
script src http://ajax.aspnetcdn.com/ajax/jquery/jquery-1.12.4.min.js /script
script src https://cdn.staticfile.org/jquery/3.4.0/jquery.min.js /script
script src https://cdn.staticfile.org/jquery-cookie/1.4.1/jquery.cookie.min.js /script
script
function submitForm() {
var token $.cookie( csrftoken );
var user $( #user ).val();
$.ajax({
url: /csrf1.html ,
type: POST ,
headers: { X-CSRFToken : token},
data: { user : user},
success: function (arg) {
console.log(arg);
/script
/body
可以通过 $.cookie 来查看和修改



