模型创建之后,Django自动为我们的模型生成了一套完整、方便、高效的API,用来对数据进行增删改查。
接下来我们结合之前创建的Modles来进行介绍,下面是我们的Models代码:
from django.db import models from django.contrib.auth.models import User #导入Django自带用户模块 # 文章分类 class Category(models.Model): name = models.CharField('博客分类', max_length=100) index = models.IntegerField(default=999, verbose_name='分类排序') class Meta: verbose_name = '博客分类' verbose_name_plural = verbose_name def __str__(self): return self.name #文章标签 class Tag(models.Model): name = models.CharField('文章标签',max_length=100) class Meta: verbose_name = '文章标签' verbose_name_plural = verbose_name def __str__(self): return self.name #推荐位 class Tui(models.Model): name = models.CharField('推荐位',max_length=100) class Meta: verbose_name = '推荐位' verbose_name_plural = verbose_name def __str__(self): return self.name #文章 class Article(models.Model): title = models.CharField('标题', max_length=70) excerpt = models.TextField('摘要', max_length=200, blank=True) category = models.ForeignKey(Category, on_delete=models.DO_NOTHING, verbose_name='分类', blank=True, null=True) #使用外键关联分类表与分类是一对多关系 tags = models.ManyToManyField(Tag,verbose_name='标签', blank=True) #使用外键关联标签表与标签是多对多关系 img = models.ImageField(upload_to='article_img/%Y/%m/%d/', verbose_name='文章图片', blank=True, null=True) body = models.TextField() user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='作者') """ 文章作者,这里User是从django.contrib.auth.models导入的。 这里我们通过 ForeignKey 把文章和 User 关联了起来。 """ views = models.PositiveIntegerField('阅读量', default=0) tui = models.ForeignKey(Tui, on_delete=models.DO_NOTHING, verbose_name='推荐位', blank=True, null=True) created_time = models.DateTimeField('发布时间', auto_now_add=True) modified_time = models.DateTimeField('修改时间', auto_now=True) class Meta: verbose_name = '文章' verbose_name_plural = '文章' def __str__(self): return self.title
1.基础准备
我们先来配置下URL:
myblog/views.py from django.contrib import admin from django.urls import path from blog import views urlpatterns = [ path('admin/', admin.site.urls), path('orm/', views.orm, name='orm'), # 新增 ]
再添加一个与URL对应的视图函数:
from django.shortcuts import render, HttpResponse # Create your views here. def orm(request): return HttpResponse('orm')
在浏览器中访问http://127.0.0.1:8000/orm/ ,就会在浏览器中看到输入“orm”。我们这么做的目的是一会我们进行数据操作的方法全都写在orm这个视图函数中,这样通过访问URL就可以触发视图函数,从而来验证我们的效果。
2.新增数据(add)
blog/views.py from django.shortcuts import render, HttpResponse from .models import Article # Create your views here. def orm(request): # 增加一篇文章 Article.objects.create(title='标题一', excerpt='摘要一', body='正文一', category_id=4, tui_id=2, user_id=1) return HttpResponse('orm')
在进行新增操作之前,数据库中文章内容如下:
在浏览器中访问http://127.0.0.1:8000/orm/,触发视图函数orm后,刷新数据库查看效果:
从上面的图中可以看到我们已经成功添加了一篇文章,证明我们新增文章成功。
数据新增的方法有三种:
blog/views.py from django.shortcuts import render, HttpResponse from .models import Article # Create your views here. def orm(request): # 第一种方法: # Article.objects.create(title='标题一', excerpt='摘要一', body='正文一', category_id=4, tui_id=2, user_id=1) # 第二种方法:添加数据,实例化表类,在实例化里传参为字段和值 obj = Article(title='标题二', excerpt='摘要二', body='正文二', user_id=1, category_id=4, tui_id=2, ) # 写入数据库 obj.save() # 第三种方法:将要写入的数据组合成字典,键为字段,值为数据 dic = {'title': '标题三', 'excerpt': '摘要三', 'body': '正文三', 'category_id': '4', 'tui_id': '2', 'user_id': '1'} # 添加到数据库,注意字典变量名称一定要加** Article.objects.create(**dic) return HttpResponse('orm')
使用第二和第三种方法增加数据,刷新页面之后,数据库效果如下:
我们看到,数据库里已经增加了两条数据。
严格来说,增加数据只有两种:create( )方法和save( )方法。一般我们推荐使用第三种方法。
3.删除数据(delete)
from django.shortcuts import render, HttpResponse from .models import Article # Create your views here. def orm(request): # 删除id为8的文章(数据) Article.objects.filter(id=8).delete() return HttpResponse('orm')
删除之前:
删除之后:
从上图可以看到ID为8的文章已经被删除了。
4.更新数据(update)
from django.shortcuts import render, HttpResponse from .models import Article # Create your views here. def orm(request): # 把id=7的文章标题,修改成'我是被修改后的标题二'。将指定条件的数据更新,支持 **kwargs,支持字典。 Article.objects.filter(id=7).update(title='我是被修改后的标题二') return HttpResponse('orm')
修改之前:
修改之后:
从上图可以看到ID=7的文章标题被修改成功了!
5.查询数据
from django.shortcuts import render, HttpResponse from .models import Article # Create your views here. def orm(request): # 查询所有数据,查询结果为QuerySet,返回当前表中的所有记录 # articles = Article.objects.all() # 使用filter()方法过滤指定条件的记录 # article = Article.objects.filter(id=1) # 使用get()方法查询指定条件的记录 article = Article.objects.get(id=1) return HttpResponse('orm')
Django提供的查询API还有很多,这里就不一一介绍了,后续再整理!