建设本地网站 配置iis,域名买了怎么做网站,建立网站原理,seo信息优化文章目录 一、基本了解二、一对一关系三、一对多关系3.1 增删改查3.2 案例#xff1a;应用详情页3.2 案例#xff1a;新建应用页 四、多对多关系4.1 增删改查4.2 案例#xff1a;应用详情页4.3 案例#xff1a;部署应用页 一、基本了解 常见数据模型关系#xff1a; 一对一… 文章目录 一、基本了解二、一对一关系三、一对多关系3.1 增删改查3.2 案例应用详情页3.2 案例新建应用页 四、多对多关系4.1 增删改查4.2 案例应用详情页4.3 案例部署应用页 一、基本了解 常见数据模型关系 一对一(one-to-one)OneToOneField。一个表中的每条记录对应另一个表中的每条记录使用OneToOneField建立关系。一对多多对一(one-to-many)ForeignKey多对多many-to-manyManyToManyField所谓的一对一、一对多是指数据库中的表之间的关系。 二、一对一关系 应用场景当一张表想扩展字段最常用的方式就是在这个表添加一个对一关系创建第二张表第二张表的id字段余第一张表的id字段关联在一起以此起到一对一。 1.修改模型类文件myapp/models.py新增一个类创建第二张表。
class IdCard(models.Model):number models.CharField(max_length20, verbose_name身份证号)address models.CharField(max_length50, default武汉)user models.OneToOneField(User,on_deletemodels.CASCADE) # 定义一对一的模型关系2.生成迁移文件并同步。
python manage.py makemigrations
python manage.py migrate3.添加数据。
#####################################################
##往已有数据的myapp_user表中添加新数据该条新数据中包含身份证号、地址信息。
user_obj User.objects.create(useralan,name阿兰,sex女,age25,label运营,漂亮,喜欢购物) ##先往母表myapp_user表中添加。
IdCard.objects.create(useruser_obj, number456789, address北京) ##再往子表myapp_idcard表中添加此处的user是模型类中定义的user。#####################################################
##向已有用户添加身份证信息
user_obj User.objects.get(userqingjun)
IdCard.objects.create(useruser_obj,number123456789, address杭州)4.查询数据。
#####################################################
反向查询通过用户查到身份证信息user-idcard
user User.objects.get(userqingjun)
print(user.idcard.number)
print(user.idcard.address)#####################################################
正向查询从身份证表查用户idcard-user
idcard IdCard.objects.get(user_id1)
print(idcard.user.user)
print(idcard.user.name)5.修改数据。
user_obj User.objects.get(userqingjun)
#####################################################
# 修改子表中的身份证信息
user_obj.idcard.address河南
user_obj.idcard.save()
#####################################################
# 修改母表中的用户信息
user_obj.age 38
user_obj.save()6.删除数据。
##删除“阿兰”用户的所有信息包括子表中的“身份证号”、“地址”
User.objects.filter(useralan).delete()三、一对多关系 一对一是表与表之间的关系而一对多、多对多是表与表中数据的关系。 一对多A表中的某个记录对应B表中的多条记录使用ForeignKey建立关系。 应用场景项目部署涉及表项目表、应用表、服务器表等等。 一对多一个项目有多个应用一个应用只能属于一个项目。多对多一个应用部署到多台服务器一个服务器部署多个应用。 3.1 增删改查
1.修改模型类文件myapp/models.py新增模型类创建项目中的三张表。
##第一张表项目表。
class Project(models.Model):name models.CharField(max_length30)describe models.CharField(max_length100, nullTrue)datetime models.DateTimeField(auto_now_addTrue)def __str__(self):return self.nameclass Meta:db_table projectverbose_name_plural 项目##第二张表应用表。
class App(models.Model):name models.CharField(max_length30)describe models.CharField(max_length100, nullTrue)datetime models.DateTimeField(auto_now_addTrue)project models.ForeignKey(Project, on_deletemodels.CASCADE) # 定义一对多的模型关系def __str__(self):return self.nameclass Meta:db_table appverbose_name_plural 应用##第三张表服务器表。
class Server(models.Model):hostname models.CharField(max_length30)ip models.GenericIPAddressField()describe models.CharField(max_length100, nullTrue)def __str__(self):return self.hostnameclass Meta:db_table serververbose_name_plural 服务器2.生成迁移文件并同步查看数据库表。
python manage.py makemigrations
python manage.py migrate3.新增数据。
from myapp.models import Project,App
#######################################################################
往项目表中插入数据添加已知的项目名称、项目描述信息。
Project.objects.create(name电商项目,describe电商项目描述...)
Project.objects.create(name在线教育项目,describe在线教育项目描述...)
Project.objects.create(name大数据项目,describe大数据项目描述...)
#######################################################################
往应用表中插入信息将应用表与项目表关联在一起。
project_obj Project.objects.get(name电商项目)
App.objects.create(nameproduct,describe商品服务,projectproject_obj)
project_obj Project.objects.get(name大数据项目)
App.objects.create(namesearch,describe搜索服务,projectproject_obj)
project_obj Project.objects.get(name电商项目)
App.objects.create(nameorder,describe订单服务,projectproject_obj)4.查询数据。
#######################################################################
正向查询通过应用名称查询所属项目app-project
##查询某个应用所属项目。
app App.objects.get(nameproduct) # 获取应用
app.project.name # 根据获取的应用查询对应项目名称
##查询所有应用所属项目。
app_list App.objects.all()
for i in app_list:print(i.name, i.project.name, i.project.describe)
#######################################################################
反向查询通过项目名称查询有哪些应用project-app
##查询某个项目有哪些应用
project Project.objects.get(name电商项目) # 获取项目
project.app_set.all() # 根据获取的项目查询所有应用
##查询所有项目有哪些引用
project Project.objects.all()
for i in project:print(i.name, i.app_set.all()) 3.2 案例应用详情页
1.前端正向查询查应用数据。
###################################################
1.定义根路由规则ORM/urls.py
from django.urls import path,include,re_path
urlpatterns [path(myapp/,include(myapp.urls)),
]
###################################################
2.定义子路由规则ORM/myapp/urls.py
from django.urls import path
from myapp import views
urlpatterns [path(app,views.app)
]
###################################################
3.定义视图ORM/myapp/views.py
from django.shortcuts import render
from myapp.models import Project,App
def app(request):app App.objects.all()return render(request, app.html, {app: app})
###################################################
4.定义html模板templates/app.html
!DOCTYPE html
html langen
headmeta charsetUTF-8title项目表单/title
/head
body
table border1theadtrth应用名称/thth应用描述/thth所属项目/th/tr/theadtbody{% for i in app %}trtd{{ i.name }}/tdtd{{ i.describe }}/tdtd{{ i.project.name}}/td/tr{% endfor %}/tbody
/body
/html2.前端反向查询查项目数据。
###################################################
1.定义根路由规则ORM/urls.py
from django.urls import path,include,re_path
urlpatterns [path(myapp/,include(myapp.urls)),
]
###################################################
2.定义子路由规则ORM/myapp/urls.py
from django.urls import path
from myapp import views
urlpatterns [path(project,views.project),
]
###################################################
3.定义视图ORM/myapp/views.py
from django.shortcuts import render
from myapp.models import Project,App
def project(request):project_list Project.objects.all()return render(request, project.html, {project_list: project_list})
###################################################
4.定义html模板templates/project.html
!DOCTYPE html
html langen
headmeta charsetUTF-8title项目表单/title
/head
body
table border1theadtrth项目名称/thth项目描述/thth所有应用/th/tr/theadtbody{% for i in project_list %}trtd{{ i.name }}/tdtd{{ i.describe }}/tdtd{% for n in i.app_set.all %}{{ n }}{% endfor %}/td/tr{% endfor %}/tbody
/body
/html3.2 案例新建应用页 新建应用页页面可添加应用并可选项目。 1.前端添加新应用后端数据入库。
###################################################
1.定义根路由规则ORM/urls.py
from django.urls import path,include,re_path
urlpatterns [path(myapp/,include(myapp.urls)),
]
###################################################
2.定义子路由规则ORM/myapp/urls.py
from django.urls import path
from myapp import views
urlpatterns [path(app_add,views.app_add),
]
###################################################
3.定义视图ORM/myapp/views.py
from django.shortcuts import render
from myapp.models import Project,App
def app_add(request):if request.method GET:project_list Project.objects.all()return render(request,app_add.html, {project_list: project_list})elif request.method POST:app_name request.POST.get(app-name)app_describe request.POST.get(app-describe)project_name request.POST.get(project-name)project_list Project.objects.all()if not app_name:msg 添加字段异常return render(request, app_add.html, {project_list: project_list, msg: msg})try:project_obj Project.objects.get(nameproject_name)App.objects.create(nameapp_name, describeapp_describe, projectproject_obj)msg 添加成功code 0except:msg 添加失败code 1return render(request, app_add.html, {project_list: project_list, msg: msg,code:code})
###################################################
4.定义html模板templates/app_add.html
!DOCTYPE html
html langen
headmeta charsetUTF-8title创建应用/title
/head
body
form action methodpost应用名称 : input typetext nameapp-namebr应用描述 : input typetext nameapp-describebr所属项目 :select nameproject-name id{% for i in project_list %}option value{{ i.name }}{{ i.name }}/option{% endfor %}/selectbrbutton typesubmit创建/buttonbutton typereset清空/button{{ msg }}
/form
/body
/html2.前端页面添加新应用。
四、多对多关系 多对多A表中的某个记录对应B表中的多条记录B表中的某个记录对应A表中多条记录。使用ManyToManyField建立关系。过程中Django会自动创建一个表来管理多对多关系称为中间表这个中间表的名称使用多对多的名称和包含这张表的模型的名称生成也可以使用db_table选项指定这个中间表名称。 应用场景一个应用部署到多台服务器一个服务器部署多个应用。 4.1 增删改查
1.修改模型类文件myapp/models.py将server表和app表进行关联。
##第三张表服务器表。
class Server(models.Model):hostname models.CharField(max_length30)ip models.GenericIPAddressField()describe models.CharField(max_length100, nullTrue)app models.ManyToManyField(App) ##添加此行。def __str__(self):return self.hostnameclass Meta:db_table serververbose_name_plural 服务器2.生成迁移文件并同步查看中间表。
python manage.py makemigrations
python manage.py migrate3.往server表添加数据。
from myapp.models import App,Project,Server
Server.objects.create(hostnameec-test1, ip192.168.1.10, describe电商项目测试服务器1)
Server.objects.create(hostnameec-test2, ip192.168.1.11, describe电商项目测试服务器2)
Server.objects.create(hostnamebigdata-test1, ip192.168.1.11, describe大数据项目测试服务器1)4.将一个新应用部署到指定服务器信息添加到数据库中。
project_obj Project.objects.get(name电商项目)
app App.objects.create(nameportal,describe前端服务,projectproject_obj)
server Server.objects.get(hostnameec-test1)
server.app.add(app)5.查询数据。
#######################################################################
正向查询查询服务器部署了哪些应用server-app
##查询某台服务器部署了哪些应用
server Server.objects.get(hostnameec-test1)
server.app.all()
##查询所有服务器部署了哪些应用
server_list Server.objects.all()
for i in server_list:print(i.hostname, i.app.all())
#######################################################################
反向查询查看某个应用部署到哪些服务器app-server
##查询某个应用部署到哪些服务器
app App.objects.get(nameportal)
app.server_set.all()
##查询所有应用部署到哪些服务器
app_list App.objects.all()
for i in app_list:print(i.name, i.server_set.all())6.根据已存在的app信息将其添加到服务器表中。
##获取应用表中的app_id字段进行关联。
app App.objects.get(nameqingjun)
app.id
server Server.objects.get(hostnamebigdata-test1)
server.app.add(3) #将应用id3关联该服务器。
server.app.add(1,2,3) #将应用id1、2、3关联该服务器。7.删除将id3的应用与ec-test1服务器取消关联。
server Server.objects.get(hostnameec-test1)
server.app.remove(3) 8.清空将ec-test1服务器取消所有应用关联。
server Server.objects.get(hostnameec-test1)
server.app.clear()4.2 案例应用详情页
1.前端正向查询。
###################################################
1.定义根路由规则ORM/urls.py
from django.urls import path,include,re_path
urlpatterns [path(myapp/,include(myapp.urls)),
]
###################################################
2.定义子路由规则ORM/myapp/urls.py
from django.urls import path
from myapp import views
urlpatterns [path(server,views.server),
]
###################################################
3.定义视图ORM/myapp/views.py
from django.shortcuts import render
from myapp.models import Project,App,Server
def server(request):server_list Server.objects.all()return render(request, server.html, {server_list: server_list})
###################################################
4.定义html模板templates/server.html
!DOCTYPE html
html langen
headmeta charsetUTF-8title服务器详情/title
/head
body
table border1theadtrth服务器名称/ththIP/thth所有应用/th/tr/theadtbody{% for i in server_list %}trtd{{ i.hostname }}/tdtd{{ i.ip }}/tdtd{% for n in i.app.all %}{{ n }}{% endfor %}/td/tr{% endfor %}/tbody
/body
/html2.前端反向查询查项目数据。
###################################################
1.定义根路由规则ORM/urls.py
from django.urls import path,include,re_path
urlpatterns [path(myapp/,include(myapp.urls)),
]
###################################################
2.定义子路由规则ORM/myapp/urls.py
from django.urls import path
from myapp import views
urlpatterns [path(app_server, views.app_server),
]
###################################################
3.定义视图ORM/myapp/views.py
from django.shortcuts import render
from myapp.models import Project,App
def app_server(request):app_server App.objects.all()return render(request, app_server.html, {app_server: app_server})
###################################################
4.定义html模板templates/app_server.html
!DOCTYPE html
html langen
headmeta charsetUTF-8title应用详情/title
/head
body
table border1theadtrth应用名称/thth服务器列表/th/tr/theadtbody{% for i in app_server %}trtd{{ i.name}}/tdtd{% for n in i.server_set.all %}{{ n }}{% endfor %}/td/tr{% endfor %}/tbody
/body
/html
###################################################
5.将search应用部署在bigdata-test1服务器中将该信息填入到数据库。
app App.objects.get(namesearch)
server Server.objects.get(hostnamebigdata-test1)
server.app.add(app) 4.3 案例部署应用页
1.前端添加新应用后端数据入库。
###################################################
1.定义根路由规则ORM/urls.py
from django.urls import path,include,re_path
urlpatterns [path(myapp/,include(myapp.urls)),
]
###################################################
2.定义子路由规则ORM/myapp/urls.py
from django.urls import path
from myapp import views
urlpatterns [path(app_server, views.app_server),
]
###################################################
3.定义视图ORM/myapp/views.py
from django.shortcuts import render,redirect
from myapp.models import Project,App
def app_add(request):if request.method GET:project_list Project.objects.all()server_list Server.objects.all()return render(request,app_add.html, {project_list: project_list,server_list:server_list})elif request.method POST:app_name request.POST.get(app-name)app_describe request.POST.get(app-describe)project_name request.POST.get(project-name)server_list request.POST.getlist(server-list) # 使用getlist获取用于获取表单多少值if not app_name:msg 添加字段异常return render(request, app_add.html)try:project_obj Project.objects.get(nameproject_name)app App.objects.create(nameapp_name, describeapp_describe, projectproject_obj)# 将服务器(可能多个)关联应用print(server_list)for server in server_list:server Server.objects.get(hostnameserver)server.app.add(app)msg 添加成功code 0except:msg 添加失败code 1return redirect(app_add)
###################################################
4.定义html模板templates/app_add.html
!DOCTYPE html
html langen
headmeta charsetUTF-8title创建应用/title
/head
body
form action methodpost应用名称 : input typetext nameapp-namebr应用描述 : input typetext nameapp-describebr所属项目 :select nameproject-name id{% for i in project_list %}option value{{ i.name }}{{ i.name }}/option{% endfor %}/selectbr部署服务器 :select nameserver-list multiple{% for i in server_list %}option value{{ i.hostname }}{{ i.hostname }}/option{% endfor %}br/selectbrbutton typesubmit创建/buttonbutton typereset清空/button{{ msg }}
/form
/body
/html
###################################################
5.修改templates/app.html模板内容显示服务器列表信息。
!DOCTYPE html
html langen
headmeta charsetUTF-8title应用表单/title
/head
body
table border1theadtrth应用名称/thth应用描述/thth所属项目/thth服务器列表/th/tr/theadtbody{% for i in app %}trtd{{ i.name }}/tdtd{{ i.describe }}/tdtd{{ i.project.name}}/tdtd{% for n in i.server_set.all %}{{ n }}{% endfor %}/td/tr{% endfor %}/tbody
/body
/html