第20天 django一对多 一对多跨表操作 初识jquery的AJAX django的多对多 related_name related_query_name F和Q

1、Django请求的生命周期
武彦涛:
路由系统 -> 试图函数(获取模板+数据=》渲染) -> 字符串返回给用户

2、路由系统
王腾:
/index/ -> 函数或类.as_view()
/detail/(d+) -> 函数(参数) 或 类.as_view()(参数)
/detail/(?P<nid>d+) -> 函数(参数) 或 类.as_view()(参数)
/detail/ -> include("app01.urls")
/detail/ name='a1' -> include("app01.urls")
- 视图中:reverse
- 模板中:{% url "a1" %}

3、视图
陈一波:
FBV:函数
def index(request,*args,**kwargs):
..

CBV:类
class Home(views.View):

def get(self,reqeust,*args,**kwargs):
..

获取用户请求中的数据:
request.POST.get
request.GET.get
reqeust.FILES.get()

# checkbox,
........getlist()

request.path_info


文件对象 = reqeust.FILES.get()
文件对象.name
文件对象.size
文件对象.chunks()

# <form 特殊的设置></form>


给用户返回数据:
render(request, "模板的文件的路径", {'k1': [1,2,3,4],"k2": {'name': '张扬','age': 73}})
redirect("URL")
HttpResponse(字符串)


4、模板语言
冯国富:
肾阳
程表
高晓峰
render(request, "模板的文件的路径", {'obj': 1234, 'k1': [1,2,3,4],"k2": {'name': '张扬','age': 73}})

<html>

<body>
<h1> {{ obj }} </h1>
<h1> {{ k1.3 }} </h1>
<h1> {{ k2.name }} </h1>
{% for i in k1 %}
<p> {{ i }} </p>
{% endfor %}

{% for row in k2.keys %}
{{ row }}
{% endfor %}

{% for row in k2.values %}
{{ row }}
{% endfor %}

{% for k,v in k2.items %}
{{ k }} - {{v}}
{% endfor %}

</body>
</html>

5、ORM
吴世鹏
闫利鹏
a. 创建类和字段
class User(models.Model):
age = models.IntergerFiled()
name = models.CharField(max_length=10)#字符长度

Python manage.py makemigrations
python manage.py migrate

# settings.py 注册APP

b. 操作
王赛鹏


models.User.objects.create(name='qianxiaohu',age=18)
dic = {'name': 'xx', 'age': 19}
models.User.objects.create(**dic)


obj = models.User(name='qianxiaohu',age=18)
obj.save()

models.User.objects.filter(id=1).delete()

models.User.objects.filter(id__gt=1).update(name='alex',age=84)
dic = {'name': 'xx', 'age': 19}
models.User.objects.filter(id__gt=1).update(**dic)

models.User.objects.filter(id=1,name='root')
models.User.objects.filter(id__gt=1,name='root')
models.User.objects.filter(id__lt=1)
models.User.objects.filter(id__gte=1)
models.User.objects.filter(id__lte=1)

models.User.objects.filter(id=1,name='root')
dic = {'name': 'xx', 'age__gt': 19}
models.User.objects.filter(**dic)

v1 = models.Business.objects.all()
# QuerySet ,内部元素都是对象

# QuerySet ,内部元素都是字典
v2 = models.Business.objects.all().values('id','caption')
# QuerySet ,内部元素都是元组
v3 = models.Business.objects.all().values_list('id','caption')

# 获取到的一个对象,如果不存在就报错
models.Business.objects.get(id=1)
对象或者None = models.Business.objects.filter(id=1).first()


外键:
v = models.Host.objects.filter(nid__gt=0)
v[0].b.caption ----> 通过.进行跨表






外键:
class UserType(models.Model):
caption = models.CharField(max_length=32)
id caption
# 1,普通用户
# 2,VIP用户
# 3, 游客

class User(models.Model):
age = models.IntergerFiled()
name = models.CharField(max_length=10)#字符长度
# user_type_id = models.IntergerFiled() # 约束,
user_type = models.ForeignKey("UserType",to_field='id') # 约束,

name age user_type_id
# 张扬 18 3
# 张A扬 18 2
# 张B扬 18 2




张扬:
position:fixed absolute relative




Ajax

$.ajax({
url: '/host',
type: "POST",
data: {'k1': 123,'k2': "root"},
success: function(data){
// data是服务器端返回的字符串
var obj = JSON.parse(data);
}
})


建议:永远让服务器端返回一个字典

return HttpResponse(json.dumps(字典))




多对多:
创建多对多:
方式一:自定义关系表
class Host(models.Model):
nid = models.AutoField(primary_key=True)
hostname = models.CharField(max_length=32,db_index=True)
ip = models.GenericIPAddressField(protocol="ipv4",db_index=True)
port = models.IntegerField()
b = models.ForeignKey(to="Business", to_field='id')
# 10
class Application(models.Model):
name = models.CharField(max_length=32)
# 2

class HostToApp(models.Model):
hobj = models.ForeignKey(to='Host',to_field='nid')
aobj = models.ForeignKey(to='Application',to_field='id')

# HostToApp.objects.create(hobj_id=1,aobj_id=2)










方式二:自动创建关系表
class Host(models.Model):
nid = models.AutoField(primary_key=True)
hostname = models.CharField(max_length=32,db_index=True)
ip = models.GenericIPAddressField(protocol="ipv4",db_index=True)
port = models.IntegerField()
b = models.ForeignKey(to="Business", to_field='id')
# 10
class Application(models.Model):
name = models.CharField(max_length=32)
r = models.ManyToManyField("Host")

无法直接对第三张表进行操作

obj = Application.objects.get(id=1)
obj.name

# 第三张表操作
obj.r.add(1)
obj.r.add(2)
obj.r.add(2,3,4)
obj.r.add(*[1,2,3,4])

obj.r.remove(1)
obj.r.remove(2,4)
obj.r.remove(*[1,2,3])

obj.r.clear()

obj.r.set([3,5,7])

# 所有相关的主机对象“列表” QuerySet
obj.r.all()