一,Model数据关系:
(1)种类:
- 一对一关系(例如身份证和钥匙,账号密码等,各自一一对应。),
- 一对多关系 (例如一个作者可以有很多作品,但一个作品只能有一个作者)
- 多对多关系 (例如学生和选课之间的关系,一个学生可以选多门课,且一门课可以被多个学生选)
通常我们的关系建立在数据库的表与表之间,有力这种关系我们的查询可以得到优化,我们的数据也更加简洁,可以实现复杂的业务管理。
(2)django中Models的关系设置:
1,OnetoOneField (--关键字 )一对一,将字段定义在任意一端,几乎不用。
2,ForeignKey:一对多,将字段定义在多的一端。
指令示例:
article = models.ForeignKey('对象',on_delete=models.CASCADE,related_name='名称',verbose_name="中文名称")
on_delete是删除时的关联设置,如果需要相牵连的话需要在此设置,
3,ManyToManyField : 多对多,将字段定义在两端中
指令示例:
category = models.ManyToManyField(对象,related_name='名称',verbose_name='中文名称')
二,数据接口:
就像是我们的插座一样,这里的数据接口,或者叫API接口就是我们获取某些数据或者访问某些内容所走的渠道或途径。最常见的就是地图,通过接受数据库和发送设备之间的频繁数据接口的调用,来不断更新地图的状态。]
(1)写接口前的准备:
环境配置:
先将我们的pycharm项目创建好:
然后就是我们manage.py文件的配置,如果不配置相关内容,则该文件跑不起来,这跟我们之前的调用无关,只是单纯的manage.py的运行
在编辑设置里面我们可以进行相关配置:
在这里配置我们之前运行后端服务的代码,然后我们的manage.py就可以正常跑了:
现在来创建一个应用:
django-admin 和 python manage.py的区别是后者在环境变量配置好后,任意目录可以使用,比较方便。
然后创建完在settings里面注册。
然后来写我们的数据库表以及表与表之间的关系:
from django.db import models# Create your models here.
class Article(models.Model):title = models.CharField(max_length=20)content = models.TextField() #---这是长文本格式popularity = models.IntegerField(default=0) #这是整数类型格式,默认是0creat_at = models.DateTimeField(auto_now_add=True) #日期格式,自动将当前日期赋予该对象img = models.ImageField(upload_to='articles/images/') #图片地址,后面接着我们对应的存放位置,不写上传到根目录author = models.ForeignKey("Author",on_delete=models.CASCADE) #一对多关系def __str__(self):return self.titleclass Author(models.Model):name = models.CharField(max_length=100)email = models.EmailField() #这是邮箱地址格式def __str__(self):return self.name
执行迁移时如果没有下载pillow可以通过:python -m pip install Pillow
那现在我们先写进去一些死数据(写进表里面):
INSERT INTO articles_author (name, email) VALUES ('花开富贵', '111@qq.com');
INSERT INTO articles_author (name, email) VALUES ('电台王子', '221@qq.com');
INSERT INTO articles_author (name, email) VALUES ('花园小哥', '441@qq.com');
INSERT INTO articles_article (id, title, content, popularity, creat_at, img, author_id) VALUES (1, '科学家发现新物种巨型章鱼', '在一项突破性的发现中,海洋生物学家们在太平洋深处发现了一种新物种的巨型章鱼。这种难以捉摸的生物被称为“巨型章鱼”,身长超过20英尺,具有卓越的智力。这一发现揭示了深海生物的神秘世界,并强调了海洋保护工作的重要性。', 1200, '2024-05-23 00:00:00', 'articles/images/微信截图_20240525143736.png', 1);
INSERT INTO articles_article (id, title, content, popularity, creat_at, img, author_id) VALUES (2, '机器人公司推出逼真的人形伴侣', '一家机器人公司推出了最新的产品:一款逼真的人形伴侣,旨在为有需要的个人提供陪伴和帮助。这款人形伴侣名为“艾娃”,具有先进的人工智能和富有表情的面部特征,使其在许多方面难以与真人区分。有望彻底改变护理和社交互动的方式,艾娃代表了机器人技术的重大进步。', 1500, '2024-05-24 00:00:00', 'articles/images/微信截图_20240525143721.png', 1);
INSERT INTO articles_article (id, title, content, popularity, creat_at, img, author_id) VALUES (3, '世界上最大的巧克力条刷新吉尼斯世界纪录', '全球巧克力爱好者正在庆祝,因为一家糖果公司打破了有史以来最大巧克力条的吉尼斯世界纪录。这块重达12,000磅的巨型巧克力条高6英尺,宽10英尺。这一甜蜜的成就证明了人类的智慧和对巧克力的普遍喜爱。', 1800, '2024-05-25 00:00:00', 'articles/images/微信截图_20240525143649.png', 1);
INSERT INTO articles_article (id, title, content, popularity, creat_at, img, author_id) VALUES (4, 'SpaceX成功发射探索木星卫星的任务', 'SpaceX在太空探索中取得了又一个里程碑,成功发射了一项探索木星卫星的任务。这个名为“木星奥德赛”的任务旨在研究木星的卫星欧罗巴、伽尼米德和卡利斯托上的生命迹象和潜在的宜居性。这一雄心勃勃的事业标志着我们对太阳系的认识和外星生命的探索迈出了重要的一步。', 2200, '2024-05-26 00:00:00', 'articles/images/微信截图_20240525143637_1SYKq1w.png', 1);
INSERT INTO articles_article (id, title, content, popularity, creat_at, img, author_id) VALUES (5, '新研究表明,狗可以以97%的准确率检测出COVID-19', '一项由一所领先大学的研究人员进行的突破性研究表明,狗具有以惊人的准确率检测出COVID-19的能力。研究发现,经过训练的嗅探犬能够以97%的成功率在人类汗液样本中识别出该病毒。这一发现可能彻底改变疾病检测方法,并有助于遏制疫情的传播。', 1900, '2024-05-27 00:00:00', 'articles/images/微信截图_20240525143354_KuxJED3.png', 1);
INSERT INTO articles_article (id, title, content, popularity, creat_at, img, author_id) VALUES (6, '科学家发现古代城市遗址', '考古学家在中东地区发现了一座古老的城市遗址,该遗址可以追溯到数千年前。这座城市遗址的发现为人类历史提供了重要的线索,揭示了古代文明的繁荣与衰落。这一发现将对人类历史学研究产生深远影响。', 800, '1990-08-15 00:00:00', 'articles/images/微信截图_20240525143617.png', 1);
INSERT INTO articles_article (id, title, content, popularity, creat_at, img, author_id) VALUES (7, '新药物治愈白血病', '医学界取得了重大突破,一种新药物被证实能够有效治愈一种顽固的白血病。这一发现为白血病患者带来了希望,也为医学界的研究和发展开辟了新的方向。这一里程碑式的进展将对白血病治疗产生深远影响。', 1000, '1995-04-02 00:00:00', 'articles/images/微信截图_20240525143559.png', 1);
INSERT INTO articles_article (id, title, content, popularity, creat_at, img, author_id) VALUES (8, '互联网改变人们的生活方式', '随着互联网的普及,人们的生活方式发生了翻天覆地的变化。互联网不仅改变了人们的工作方式,还改变了人们的娱乐、社交和学习方式。这一数字化时代的到来标志着人类社会迈入了全新的时代。', 1200, '2000-09-10 00:00:00', 'articles/images/微信截图_20240525143544.png', 2);
INSERT INTO articles_article (id, title, content, popularity, creat_at, img, author_id) VALUES (9, '世界各地庆祝新千年的到来', '全球各地的人们欢庆新千年的到来,举办了盛大的庆祝活动。从烟火晚会到音乐节,人们用各种方式迎接新时代的到来。这一历史性时刻将永远被载入人类历史的篇章中。', 1500, '2000-01-01 00:00:00', 'articles/images/微信截图_20240525143518.png', 2);
INSERT INTO articles_article (id, title, content, popularity, creat_at, img, author_id) VALUES (10, '人类成功登陆火星', '人类历史上的又一次伟大壮举,宇航员成功登陆火星表面。这标志着人类征服太空的新里程碑,也为未来太空探索开辟了新的篇章。这一壮举将永远被视为人类勇气和探索精神的象征。', 2000, '2020-07-30 00:00:00', 'articles/images/微信截图_20240525143447.png', 1);
INSERT INTO articles_article (id, title, content, popularity, creat_at, img, author_id) VALUES (11, '新能源技术改变能源格局', '新能源技术的迅猛发展正在改变全球能源格局。太阳能、风能等清洁能源的广泛应用将有助于减缓气候变化,并减少对传统能源的依赖。这一能源革命将为人类未来的可持续发展带来新的希望。', 1800, '2015-11-20 00:00:00', 'articles/images/微信截图_20240525143432.png', 2);
INSERT INTO articles_article (id, title, content, popularity, creat_at, img, author_id) VALUES (12, '机器人服务行业崛起', '机器人技术的不断进步推动了机器人服务行业的迅速崛起。从餐厅服务到医疗护理,机器人已经开始在各个领域发挥重要作用。这一趋势将对未来的劳动力市场和产业结构产生深远影响。', 1600, '2018-03-05 00:00:00', 'articles/images/微信截图_20240525143419.png', 1);
INSERT INTO articles_article (id, title, content, popularity, creat_at, img, author_id) VALUES (13, '人工智能改变医疗诊断', '人工智能技术的应用正在改变医疗诊断的方式。智能诊断系统能够快速准确地识别疾病和异常,为医生提供更可靠的诊断依据。这一技术的推广将极大地提高医疗诊断的效率和精确度。', 1900, '2019-09-12 00:00:00', 'articles/images/微信截图_20240525143407.png', 2);
INSERT INTO articles_article (id, title, content, popularity, creat_at, img, author_id) VALUES (14, '全球范围内的疫苗接种运动', '全球范围内展开了一场规模空前的疫苗接种运动,旨在控制和消灭多种传染病。这一运动为人类健康带来了福音,也为全球公共卫生事业树立了新的标杆。这一历史性时刻将永远被记录在人类历史的长河中。', 2200, '2022-01-10 00:00:00', 'articles/images/微信截图_20240525143354.png', 1);
INSERT INTO articles_article (id, title, content, popularity, creat_at, img, author_id) VALUES (15, '全球气候变暖引发极端天气', '全球气候变暖导致极端天气事件频发,给全球各地带来严重影响。热浪、洪灾、干旱等极端天气事件的发生频率和强度不断增加,加剧了自然灾害的风险。这一挑战将需要全球合作和创新解决方案来应对。', 2300, '2023-08-28 00:00:00', 'articles/images/微信截图_20240525143309.png', 2);
在console里面直接输入并执行就可以直接加到我们的数据库里面去了;
创建media文件放本地文件: 然后在settings里面配置media
import os
MEDIA_URL = "/media/"
MEDIA_ROOT=os.path.join(BASE_DIR,"media")
MEDIA_URL是指我们的媒体文件地址;os是python配置文件,这是设置我们的媒体文件。
既然我们的图片是路径访问,我们也需要给它配置相关路径,所以我们接下来在urls里面操作:
固定写法配置我们的媒体文件:
那现在我们在应用目录里面创建urls.py然后写我们的路由设置:(前面照抄项目urls(起初未更改的)里面的内容)
先写查找的函数:在views里面如下操作:
from django.shortcuts import render
from models import Article
from django.http import HttpResponse,JsonResponse
# Create your views here.def article_list(request):data=Article.object.all()return HttpResponse(data)
然后写个二级路由(这里不展示方法了):
得到下面
改成json格式:
但注意JsonResponse的使用有一定格式如下:
前面的values使用的原因是,原本的data相当于是ID的意思,我们取的是ID,.values就是取内容了。
优质打印后得到如下:
现在就准备完毕了;
(2)认识接口:
Api接口在我们的后台也有不同的请求方式规定: 接口通常支持不同类型的请求,最常见的包括 GET、POST、PUT 和 DELETE 请求。
那我们来写一个
get请求视图函数:
这里因为我们是get请求,所以我们返还的还是原本的数据。
我们用postman来模拟其他请求看看结果:
发送前现在settings里面修改一下接口访问安全设置(因为有些访问方式django本身不允许)
将其注释掉发送post请求看看结果:
post请求视图
当我们传入参数时我们的路径也会发生相应的变化如图,这也是我们的get请求和post请求的区别了,我们的get请求关于账号密码等都是可以直接展示在路径上的,而post则不会。这也是post的优点之一。
post请求接受参数:
这样我们就可以利用我们的参数进行查找等工作了;
put请求视图:
put方法稍微特殊一些,我们需要用一个json格式进行转换后接收参数。
由于我们django里面没有直接的post参数,其内容在body里面,所以我们调body
注意:我们put接受的算是一个json文件,与正常的传参数方式不同。
delete请求视图:
和put一样要传一个json
位置:
pk的作用相当于id,该方式适用于删除某条信息。
(3)书写相应的页面接口:
我们先写一个html放在template里面:
htm初代码如下:
<!DOCTYPE html>
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title></title><style>body {font-family: Arial, sans-serif;}.search-form {margin-bottom: 20px;}.search-form input,.search-form select,.search-form button {margin-right: 10px;}.article-list {list-style: none;padding: 0;}.article-item {margin-bottom: 10px;padding: 10px;border: 1px solid #ccc;}.pagination {margin-top: 20px;}.pagination a {margin: 0 5px;text-decoration: none;}</style>
</head>
<body><div class="search-form"><form method="get"><input type="text" name="q" qlaceholder="输入要查询的关键字" value="{{ request.GET.q }}"><button type="submit">搜索</button></form></div>
<h1>文章列表</h1><ul id="article-list" class="article-list">{% for article in page_obj %}<li class="article-item"><img style="" src="{{ article.img.url }}"><strong>{{ article.title }}</strong>-热度:{{ article.popularity }}-发布日期:{{ article.creat_at }} -作者:{{ article.author.name }}</li>{% endfor %}</ul></body>
</html>
注意:author后面加个name是因为两个表直接通过author建立了一对多的关系,可以这样去调用另一个表里面的数据
先写个视图函数,往html里面传点数据吧:
示例1:
书写好我们上面接受数据的格式后写个路由:
然后去访问该地址(http://127.0.0.1:8000/article/list)就可以看到如下:
看不到图片是因为我们的medai/image里面没有放图片,放进去就好了。
示例2:
根据id(pk)去查询,pk参数是我们搜素栏所传的。----参数不能为空,否则报错,这里我们用else避免了报错的情况
写个新路由,然后访问看看:
输入id便可查的所需文章。
特别地:
如果我们将原本的pk改为title就可以修改我们查找的对象 --依据title查找:
示例3:
根据日期查找:
我们可以挑选年月日查找;
get请求缺陷:如果由多个条件满足查找条件,会报错,现在将其改成filter就好了:
1,多重查询:
先对html做一下修改:
必须两个条件同时满足才可以查询:
2,过滤查询:
事前导入一个库:Q
Q查询可以查询不同的条件,满足一个即可。
因为我们是and所以,我们还是两个都需要输入。满足其中之一条件的全部展示。
3,排序操作:
按照要求升序和降序:
先修改html里面的选择栏:
creat_at前面带负号是降序,不带负号是升序。
总结:熟悉各种关系的建立以及使用和了解一些请求方式的书写,更多的是熟练以上的一些查询。