ORM(1)转载
程序员文章站
2022-06-20 12:23:00
...
博客核心内容:
1、Foreign_key可以理解为另外一张表的一行对象
2、通过双下划线可以跨到另外一张表
3、三种方法返回的都是query对象的集合(对象、字典、元组)
4、dp = models.ForeignKey(to="Depart", to_field='id')中的dp实际上是一个对象,在数据库中存在的真正字段是dp_id
表结构展示:
程序1:
from django.shortcuts import render,HttpResponse
# Create your views here.
def index(request):
if request.method == "GET":
pass
elif request.method == "POST":
pass
return HttpResponse("OK")
from django.views import View
class User(View):
def dispatch(self, request, *args, **kwargs):
print('before')
obj = super(User,self).dispatch(request, *args, **kwargs)
print('after')
return obj
def get(self,request):
print('get....')
return HttpResponse("....")
def post(self,request):
print('post..')
return HttpResponse("....")
from app01 import models
def test(request):
# models.Depart.objects.create(title='IT')
# models.Depart.objects.create(title='咨询')
# models.Depart.objects.create(title='公关')
# models.UserInfo.objects.create(username='alex',password='123',dp_id=1)
# models.UserInfo.objects.create(username='eric',password='123',dp_id=1)
# models.UserInfo.objects.create(username='何磊',password='123',dp_id=1)
# models.UserInfo.objects.create(username='刘浩',password='123',dp_id=2)
#Foreign_key可以理解为另外一张表的一行对象
#正向跨表:外键 反向跨表:表名或者表名__
#正向跨表
#1、对象
# q = models.UserInfo.objects.all()
# for row in q:
# print(row.username, row.password, row.dp_id, row.dp, row.dp.id, row.dp.title)
"""
alex 123 1 Depart object 1 IT
eric 123 1 Depart object 1 IT
何磊 123 1 Depart object 1 IT
刘浩 123 2 Depart object 2 咨询
"""
#2、字典
# q = models.UserInfo.objects.values('username', 'password', 'dp_id','dp__title')
# for row in q:
# print(row)
"""
{'password': '123', 'dp_id': 1, 'dp__title': 'IT', 'username': 'alex'}
{'password': '123', 'dp_id': 1, 'dp__title': 'IT', 'username': 'eric'}
{'password': '123', 'dp_id': 1, 'dp__title': 'IT', 'username': '何磊'}
{'password': '123', 'dp_id': 2, 'dp__title': '咨询', 'username': '刘浩'}
"""
#3、元组
# q = models.UserInfo.objects.values_list('username', 'password', 'dp_id', 'dp__title')
# for row in q:
# print(row)
# print(row[0],row[1],row[2],row[3])
"""
('alex', '123', 1, 'IT')
alex 123 1 IT
('eric', '123', 1, 'IT')
eric 123 1 IT
('何磊', '123', 1, 'IT')
何磊 123 1 IT
('刘浩', '123', 2, '咨询')
刘浩 123 2 咨询
"""
#反向跨表
#1、对象:个数就是另外一张表的行数
# v = models.Depart.objects.all()
# for row in v:
# # 可以获取到到当前部门下面的所有人:表名小写
# print(row,row.id,row.title,row.userinfo_set.all())
"""
Depart object 1 IT <QuerySet [<UserInfo: UserInfo object>, <UserInfo: UserInfo object>, <UserInfo: UserInfo object>]>
Depart object 2 咨询 <QuerySet [<UserInfo: UserInfo object>]>
Depart object 3 公关 <QuerySet []>
"""
#2、字典:反向操作的时候可能出现空值
v1 = models.Depart.objects.values('id','title')
for row in v1:
print(row)
"""
{'title': 'IT', 'id': 1}
{'title': '咨询', 'id': 2}
{'title': '公关', 'id': 3}
"""
v2 = models.Depart.objects.values('id', 'title','userinfo','userinfo__username','userinfo__password')
for row in v2:
print(row)
"""
{'title': 'IT', 'id': 1, 'userinfo__username': 'alex', 'userinfo': 1, 'userinfo__password': '123'}
{'title': 'IT', 'id': 1, 'userinfo__username': 'eric', 'userinfo': 2, 'userinfo__password': '123'}
{'title': 'IT', 'id': 1, 'userinfo__username': '何磊', 'userinfo': 3, 'userinfo__password': '123'}
{'title': '咨询', 'id': 2, 'userinfo__username': '刘浩', 'userinfo': 4, 'userinfo__password': '123'}
{'title': '公关', 'id': 3, 'userinfo__username': None, 'userinfo': None, 'userinfo__password': None}
"""
#3、元组
v3 = models.Depart.objects.values_list('id', 'title','userinfo','userinfo__username','userinfo__password')
for row in v3:
print(row)
"""
(1, 'IT', 1, 'alex', '123')
(1, 'IT', 2, 'eric', '123')
(1, 'IT', 3, '何磊', '123')
(2, '咨询', 4, '刘浩', '123')
(3, '公关', None, None, None)
"""
#多对多
#1、自己写第三张表:第三张表的列数没有限制(注意:只有自己创建的第三张表才可以通过create方式进行添加操作)
# models.U2G.objects.create(ui_id=1, ug_id=2)
# models.U2G.objects.create(ui_id=2, ug_id=2)
# models.U2G.objects.create(ui_id=3, ug_id=1)
# q = models.U2G.objects.all()
# for row in q:
# # 通过外键可以获取一行对象
# print(row.ug.caption,row.ui.username)
"""
B组 alex
B组 eric
A组 何磊
"""
# 2、Django根据ManyToManyField字段自动创建的第三张表,列数有限制
obj = models.UserGroup.objects.filter(id=1).first() # B组
#通过*在一个组里面添加两个人,也可以直接用逗号,(注意:ORM自己创建的第三张表是不能够通过create方式添加记录的,因为在orm当中没有这个类,还有另外一种方式添加:浩哥:见图1)下面是ORM自己创建的第三张表添加数据的方式.
# obj.m.add(1)
#obj.m.add(*[1,2])
#obj.m.add(1,2,3,4)
#obj.m.remove(1)
#obj.m.remove(2,3)
#obj.m.remove(*[4])
#将2组的人记录全部删除
#obj.m.clear()
#obj.m.set([3,])
#obj.m.set([3,2,1 ])
"""
操作:add remove clear set[改](设置完之后只有它自己,用来进行更新操作)
非要更新:就先找到先删除,然后增加一条
查看这个组下面的所有的人,直接拿到另外一张表
"""
q1 = obj.m.all()
print(q1)
"""
<QuerySet [<UserInfo: UserInfo object>, <UserInfo: UserInfo object>, <UserInfo: UserInfo object>]>
"""
#通过m过滤的是用户表,而不是组表
#建立在上次查询基础上,做二次查询
q2_2 = obj.m.filter(id__gt=2)
print(q2_2)
"""
<QuerySet [<UserInfo: UserInfo object>]>
"""
return HttpResponse("OK")
程序2:
from django.db import models
# Create your models here.
class Depart(models.Model):[出版社]
title = models.CharField(max_length=16)
class UserInfo(models.Model):[书表]
username = models.CharField(max_length=32)
password = models.CharField(max_length=64)
#depart = models.ForeignKey("Depart")
#depart = models.ForeignKey(to="Depart",to_field='id')
#depart = models.IntegerField()
dp = models.ForeignKey(to="Depart", to_field='id') #dp_id
#多对多并不会影响第三张表,在哪里创建都可以
#m = models.ManyToManyField('UserGroup')
class UserGroup(models.Model):[作者表]
caption = models.CharField(max_length=32)
#多对多并不会影响第三张表,在哪里创建都可以
#拿不到第三张表的类,怎么写入数据呢?
m = models.ManyToManyField('UserInfo')
书表与作者是多对多的关系,书表里面没有作者,作者表里面没有书
# class U2G(models.Model):[图书与作者关系表]
# ui = models.ForeignKey(to="UserInfo",to_field='id')
# ug = models.ForeignKey(to="UserGroup",to_field='id')
#利用Django帮我们创建第三张表
#3、创建多对多的关系
# U2G.objects.create(ui_id = 1,ug_id=2)
# U2G.objects.create(ui_id = 2,ug_id=2)
# U2G.objects.create(ui_id = 3,ug_id=1)
#
# q = U2G.objects.all()
# for row in q:
# #通过外键可以获取一行对象
# row.ui.username
# row.ug.caption
#方法1:获取用户所有的信息,包括部门名称:query对象集合
# q = UserInfo.objects.all()
# #query[obj(username,password,obj(dp[id,title]),dp_id)]
# for row in q:
# print(row.username,row.password,row.dp_id,row.dp,row.dp.id,row.dp.title)
#方法2:获取用户所有的信息,包括部门名称,但是要用values(字典)[某几列数据]
# q = UserInfo.objects.values('username','password','dp_id','dp','dp__title')
#query[{'username':'','password':'',}]
#方法3:获取用户所有的信息,但是要用values_list(元组)
# q = UserInfo.objects.values_list('username','password','dp_id','dp','dp__title')
#query[obj(username,password....),obj(),....]
后台样式:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.header{
width: 100%;
height: 48px;
background-color: darkblue;
position: fixed;
top: 0;
left: 0;
}
.left{
width: 200px;
position: absolute;
top:48px;
left: 0;
bottom: 0;
background-color: lightpink;
}
.right{
position: absolute;
top: 48px;
bottom: 0;
left: 200px;
right: 0;
overflow: scroll;
}
.left a{
display: inline-block;
width: 70px;
padding: 10px;
background-color: green;
color: white;
}
</style>
</head>
<body>
<div class="header"></div>
<div class="box">
<div class="left">
<a href="/addArticle/">继承</a>
<a href="/addArticle2/">添加文章</a>
</div>
<div class="right">
{% block content %}
<h1>yyyyyyyyyyyyyyyyyyyyyyyyyyy</h1>
{% endblock %}
{% block content2 %}
<h1>yyyyyyyyyyyyyyyyyyyyyyyyyyy</h1>
{% endblock %}
{% block content3 %}
<h1>hello</h1>
{% endblock %}
</div>
</div>
</body>
</html>
补:图一
上一篇: 后代香烟