Django 多表操作


参考视频:https://ke.qq.com/course/320021

一、多表关系

常见的数据模型关系有:
• 一对一(one-to-one),OneToOneField

• 一对多,多对一(one-to-many),ForeignKey

• 多对多(many-to-many),ManyToManyField

二、一对一

一对一:一个表中的每条记录对应另一个表中的每条记录,使用OneToOneField建立关系。

例如:一个人对应一个身份证号,一个身份证号也对应一个人

应用场景:当一个表想扩展字段,最常用的方式就是在这个表添加一个对一关系

2.1.创建模型关系

myapp/modes.py

class IdCard(models.Model):
    number = models.CharField(max_length=18, verbose_name="身份证号")
    address = models.CharField(max_length=100, verbose_name="地址")
    user = models.OneToOneField(User, on_delete=models.CASCADE)   # 与User表定义一对一的模型关系

    class Meta:
        db_table = "idcard"
        verbose_name_plural = "身份证表"

    def __str__(self):
        return self.number

迁移模型数据

python manage.py makemigrations
python manage.py migrate

2.2.增删改查

使用终端来操作

python manage.py shell
>>> from myapp.models import User,IdCard

在这里插入图片描述

增:

给新建用户添加身份证信息:

user_obj = User.objects.create(user='alan',name='阿兰',sex='女',age='25',label="运营,漂亮,喜欢购物")
IdCard.objects.create(user=user_obj, number="456789", address="北京")	#user为IdCard类中定义一对一模型关系的名字

IdCard表中的user_id为4,与user表中的id=4的数据进行了绑定
在这里插入图片描述
在这里插入图片描述
向已有用户添加身份证信息:

user_obj = User.objects.get(user="zhangsan")
IdCard.objects.create(user=user_obj,number="123456",address="湖南")

反向查询:通过用户查到身份证信息(user->idcard)

user = User.objects.get(user="zhangsan") 
print(user.idcard.number)
print(user.idcard.address)

正向查询:从身份证表查用户(idcard->user)

idcard = IdCard.objects.get(user_id=1) 
print(idcard.user.user)
print(idcard.user.name)

user_obj = User.objects.get(user="zhangsan")
user_obj.idcard.address="河南"
user_obj.idcard.save()

User.objects.filter(user="alan").delete()

三、一对多

一对一是表与表之间的关系,而一对多、多对多是表与表中数据的关系

一对多:A表中的某个记录对应B表中的多条记录,使用ForeignKey建立关系。

例如:项目部署涉及表
一个项目有多个应用,一个应用只能属于一个项目
一个应用部署到多台服务器,一个服务器部署多个应用
在这里插入图片描述

3.1.创建模型关系

3.1.1.设计三张表

# 项目表
class Project(models.Model):
    name = models.CharField(max_length=30)
    describe = models.CharField(max_length=100)
    datatime = models.DateTimeField(auto_now_add=True)  # 自动填充插入数据时的时间

    class Meta:
        db_table = "project"
        verbose_name_plural = "项目表"

    def __str__(self):
        return self.name

# 应用表
class App(models.Model):
    name = models.CharField(max_length=30)
    describe = models.CharField(max_length=100)
    datatime = models.DateTimeField(auto_now_add=True)  # 自动填充插入数据时的时间
    project = models.ForeignKey(Project, on_delete=models.CASCADE)  # 定义一对多的模型关系,一个项目对多个应用

    class Meta:
        db_table = "app"
        verbose_name_plural = "应用表"

    def __str__(self):
        return self.name

# 服务器表
class Server(models.Model):
    hostname = models.CharField(max_length=30)
    ip = models.GenericIPAddressField()
    describe = models.CharField(max_length=100)
    datatime = models.DateTimeField(auto_now_add=True)  # 自动填充插入数据时的时间

    class Meta:
        db_table = "server"
        verbose_name_plural = "服务器"

    def __str__(self):
        return self.hostname

3.1.2.同步数据到数据库

python manage.py makemigrations

设置默认值
在这里插入图片描述

3.2.增删改查

向项目表添加已知的项目名称:

Project.objects.create(name="电商项目",describe="电商项目描述...")
Project.objects.create(name="在线教育项目",describe="在线教育项目描述...")
Project.objects.create(name="大数据项目",describe="大数据项目描述...")

在这里插入图片描述

创建新应用并加入到项目中:

project_obj = Project.objects.get(name="电商项目")
App.objects.create(name="product",describe="商品服务",project=project_obj)
App.objects.create(name="order",describe="订单服务",project=project_obj)

在这里插入图片描述

3.2.1.正向查询:通过应用名称查询所属项目(app->project)

查询某个应用所属项目:

app = App.objects.get(name="product") # 获取应用
app.project.name # 根据获取的应用,查询对应项目名称

查询所有应用所属项目:

app_list = App.objects.all()
for i in app_list:
	print(i.name, i.project.name, i.project.describe)

示例:
myapp/views.py:

def release(request):
	app = App.objects.all()
	return render(request, "release.html", {"app":app})

前端

{% for i in app_list %}
{{ i.id }}
{{ i.name }}
{{ i.describe }}
{{ i.project_id }}
{{ i.project.name }}
{% endfor %}

3.2.2.反向查询:通过项目名称查询有哪些应用(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())

示例:

def app(request):
	project_list = Project.objects.all()
	return render(request, "app.html", {"project_list": project_list})
{% for i in project_list %}
	{{ i }}
	{% for x in i.app_set.all %}
		{{ x }}
	{% endfor %} 
{% endfor %}

四、多对多

多对多:A表中的某个记录对应B表中的多条记录,B表中的某个记录对应A表中多条记录。使用ManyToManyField建立关系。

例如:一个应用部署到多台服务器,一个服务器部署多个应用

4.1.创建模型关系

app = models.ManyToManyField(App)
在这里插入图片描述
同步数据后发现数据库多了一个server_app的表
在这里插入图片描述
Django会自动创建一个表来管理多对多关系,称为中间表

这个中间表的名称使用多对多的名称和包含这张表的模型的名称生成,也可以使用db_table选项指定这个中间表名称。
在这里插入图片描述

4.2.增删改查

4.2.1.添加服务器:

Server.objects.create(hostname="ec-test1", ip="192.168.1.10", describe="电商项目测试服务器1")
Server.objects.create(hostname="ec-test2", ip="192.168.1.11", describe="电商项目测试服务器2")
Server.objects.create(hostname="bigdata-test1", ip="192.168.1.11", describe="大数据项目测试服务器1")

4.2.2.部署一个应用到指定服务器:

project_obj = Project.objects.get(name="电商项目")
app = App.objects.create(name="portal",describe="前端服务",project=project_obj)
server = Server.objects.get(hostname="ec-test1")
server.app.add(app) # 将服务器关联到应用

4.2.3.正向查询:查询服务器部署了哪些应用(server->app)

查询某台服务器部署了哪些应用:

server = Server.objects.get(hostname="ec-test1")
server.app.all()

查询所有服务器部署了哪些引用:

server_list = Server.objects.all()
for i in server_list:
	print(i.hostname, i.app.all())

4.2.4.反向查询:查看某个应用部署到哪些服务器(app->server)

查询某个应用部署到哪些服务器:

app = App.objects.get(name="portal")
app.server_set.all()

查询所有应用部署到哪些服务器:

app_list = App.objects.all()
for i in app_list:
	print(i.name, i.server_set.all())

4.3.中间表关系操作

4.3.1.删除:

app = App.objects.get(name="portal")
server.app.remove(app)

4.3.2.清空:

server = Server.objects.get(hostname="ec-test1")
server.app.clear() # 将该服务器取消所有应用关联
相关推荐
<p style="color:#666666;"> <span style="font-size:14px;">本门课程重实战,将基础知识拆解到项目里,让你在项目情境里学知识。</span> </p> <p style="color:#666666;"> <span style="font-size:14px;">这样的学习方式能让你保持兴趣、充满动力,时刻知道学的东西能用在哪、能怎么用。</span> </p> <p style="color:#666666;"> <span style="font-size:14px;">平时不明白的知识点,放在项目里去理解就恍然大悟了。</span> </p> <p style="color:#666666;"> <span></span> </p> <p style="color:#666666;"> <span style="font-size:14px;"> </span> </p> <p style="color:#666666;"> <span style="color:#FF0000;font-size:14px;"><strong>一、融汇贯通</strong></span> </p> <p style="color:#666666;"> <span style="font-size:14px;">本视频采用了前后端分离的开发模式,前端使用Vue.js+Element UI实现了Web页面的呈现,后端使用PythonDjango框架实现了数据访问的接口,前端通过Axios访问后端接口获得数据。在学习完本章节后,真正理解前后端的各自承担的工作。</span> </p> <p style="color:#666666;"> <span style="font-size:14px;"> </span> </p> <p style="color:#666666;"> <span style="color:#FF0000;font-size:14px;"><strong>二、贴近实战</strong></span> </p> <p style="color:#666666;"> <span style="font-size:14px;">本系列课程为练手项目实战:学生管理系统v4.0的开发,项目包含了如下几个内容:项目的总体介绍、基本功能的演示、Vuejs的初始化、Element UI的使用、在Django中实现针对数据的增删改查的接口、在Vuejs中实现前端增删改查的调用、实现文件的上传、实现格的分页、实现导出数据到Excel、实现通过Excel导入数据、实现针对格的批量化操作等等,所有的功能都通过演示完成、贴近了实战</span> </p> <p style="color:#666666;"> <span style="font-size:14px;"> </span> </p> <p style="color:#666666;"> <span style="color:#FF0000;font-size:14px;"><strong>三、课程亮点</strong></span> </p> <p style="color:#666666;"> <span style="font-size:14px;">在本案例中,最大的亮点在于前后端做了分离,真正理解前后端的各自承担的工作。前端如何和后端交互</span> </p> <p style="color:#666666;"> <span style="font-size:14px;"> </span> </p> <p style="color:#666666;"> <span style="color:#FF0000;font-size:14px;"><strong>适合人群:</strong></span> </p> <p style="color:#666666;"> <span style="font-size:14px;">1、有Python语言基础、web前端基础,想要深入学习Python Web框架的朋友;</span> </p> <p style="color:#666666;"> <span style="font-size:14px;">2、有Django基础,但是想学习企业级项目实战的朋友;</span> </p> <p style="color:#666666;"> <span style="font-size:14px;">3、有MySQL数据库基础的朋友</span> </p> <p style="color:#666666;"> <span style="font-size:14px;"> </span> </p> <p style="color:#666666;"> <span style="font-size:14px;"><img alt="" src="https://img-bss.csdnimg.cn/202009070752197496.png" /><br /> </span> </p> <p style="color:#666666;"> <span style="font-size:14px;"><br /> </span> </p>
<p> <span style="color:#E53333;"><strong> </strong></span> </p> <p style="color:#333333;"> <strong> <span style="font-size:14px;"><span style="font-size:14px;"><strong>Django是一个开放源代码的Web应用框架,适用于中大型项目网站,由Python写成 自发布以来深受喜爱</strong></span></span> </strong> </p> <strong> </strong> <p style="color:#333333;"> <strong> <span style="font-size:14px;"><span style="font-size:14px;"><strong>目前Django已作为Python web工程师所必会的web框架,所以学好Django不光是技能的提高也是<span style="font-size:16px;color:#E53333;">面试必备技能、<span style="background-color:#FFFFFF;color:#000000;">并且通过本视频的学习在掌握Django框架的同时并提</span></span></strong></span></span></strong><span style="font-size:14px;"><span style="font-size:14px;"><span style="font-size:16px;color:#E53333;"><span style="background-color:#FFFFFF;color:#000000;"></span><span style="background-color:#FFFFFF;color:#000000;"><strong>升</strong></span></span></span></span><strong><span style="font-size:14px;"><span style="font-size:14px;"><strong><span style="font-size:16px;color:#E53333;">项目实战经验</span></strong></span></span></strong> </p> <strong> </strong> <p style="color:#333333;"> <strong> <span style="color:#000000;"><span style="color:#000000;"><strong><span style="font-size:16px;color:#000000;">Django具有如下</span></strong></span></span></strong><strong><span><span><strong><span style="font-size:16px;color:#000000;"></span></strong><span style="font-size:16px;color:#E53333;">优点</span></span></span> </strong> </p> <strong> </strong><strong> </strong> <p> </p><ol><li> <strong><span style="font-size:14px;">有完善的ORM关系映射</span></strong> </li> <li> <strong><span style="font-size:14px;">有强大的路由映射功能</span></strong> </li> <li> <strong><span style="font-size:14px;">有完善的视图模板的实现</span></strong> </li> <li> <strong><span style="font-size:14px;">有健全的后台管理系统</span></strong> </li> <li> <strong><span style="font-size:14px;">有强大的缓存支持</span></strong> </li> <li> <span style="font-size:14px;">强大的celery功能</span> </li> </ol><strong> </strong> <strong> </strong> <strong> </strong> <strong> </strong> <strong> </strong> <p style="color:#333333;"> <span style="font-size:14px;">就由</span><span style="font-size:14px;">lucky</span><span style="font-size:14px;">老师带你学习我们的</span><span style="color:#E53333;font-size:14px;"><strong>Django</strong></span><span style="font-size:14px;">吧</span> </p> <strong> </strong> <p> <br /></p>
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页