文章目录
1. 数据表操作
1.1 数据表定义
# models.py
from django.db import models
class Projects(models.Model):
# verbose_name -字段名, help_text - api文档的中文名
pj_name = models.CharField(verbose_name='项目名称', max_length=64, help_text='项目名称', unique=True)
pj_leader = models.CharField(verbose_name='项目负责人', max_length=32, help_text='项目负责人')
pj_developer = models.CharField(verbose_name='开发人员', max_length=32, help_text='开发人员')
pj_tester = models.CharField(verbose_name='测试人员', max_length=32, help_text='测试人员')
pj_app_name = models.CharField(verbose_name='应用名称', max_length=32, help_text='应用名称')
pj_app_version = models.CharField(verbose_name='应用版本', max_length=32, help_text='应用版本')
# null -字段允许为空, blank - 前端可不传参数, default - 默认值
pj_desc = models.TextField(verbose_name='项目概述', max_length=256, help_text='项目概述', blank=True, default='', null=True)
class Meta:
"""
表名
"""
db_table = 'tb_projects'
verbose_name = '项目'
verbose_name_plural = '项目'
def __str__(self):
"""
修改admin后台展示的项目名称
"""
return self.pj_name
1.2 数据表迁移
- 方式一
# 创建迁移文件
/Users/whtest/.virtualenvs/djangoweb/bin/python manage.py makemigrations
# 迁移
/Users/whtest/.virtualenvs/djangoweb/bin/python manage.py migrate
- 方式一
# 先进入manage.py命令行
步骤:Pycharm--Tools--Run manage.py Task...,执行命令
makemigrations
migrate
2. 数据库操作
2.1 C(create)
- 方式一
# views.py
from django.views import View
from project.models import Projects
class ProjectView(View):
""""
类视图
"""
def post(self, request):
# 方式一
pj = Projects(name='项目3', leader='li1', developer='lisi2', tester='ss', app_name='name1', desc='desc')
pj.save()
# 方式二
Projects.objects.create(name='项目4', leader='lisi3', developer='任我行', tester='令狐冲',
app_name='葵花宝典', desc='欲练此功 必先自宫')
return HttpResponse("<h1>Hello,Django POST</h1>")
2.2 R(retrieve)
普通查询
- objects.all(): 获取多条数据
data = Projects.objects.all()
- objects.get(id=1) : 仅可获取id=1且唯一的数据,存在多条id=1时会报错
data = Projects.objects.get(id=1)
- objects.filter(id=1): 仅获取id = 1的数据
data = Projects.objects.filter(id=1)
- objects.exclude(id=1): 仅获取id != 1的数据
data = Projects.objects.exclude(id=1)
- objects.filter(xx):过滤
# 获取项目名称包含'项目'的数据
data = Projects.objects.filter(pj_name__contains="项目")
# 获取项目名称包含'ac'的数据,且不区分大小写
data = Projects.objects.filter(pj_name__icontains="ac")
# 获取项目名称以"项目"开头的数据
data = Projects.objects.filter(pj_name__startswith="项目")
# 获取项目名称以"项目"结尾的数据
data = Projects.objects.filter(pj_name__endswith="项目")
# 获取项目名称包含"项目"、"工程"的数据
data = Projects.objects.filter(pj_name__in=["项目", "工程"])
关联查询
# 项目--接口: 1对多
# filter(外表名__字段名)
data = Projects.objects.filter(interfaces__name="接口1")
比较查询
# objects.filter(id__gt=1):仅获取id > 1的数据
# __gt >
# __gte >=
# __lt <
# --lte <=
data = Projects.objects.filter(id__gt=1)
多条件查询
- and
# objects.filter(A=a,B=b):
data = Projects.objects.filter(pj_name='项目004', pj_leader='li1')
- or
# objects.filter(Q(A=a)|Q(B=b)):
from django.db.models import Q
data = Projects.objects.filter(Q(pj_name='项目004') | Q(pj_leader='li1'))
查询集操作
查询集相当于列表,支持通过for循环、正向切片、正向索引方式取值,且支持链式操作;
查询集是惰性查询,且会缓存结果;
data = Projects.objects.filter(pj_leader='li1').first().pj_name
data = Projects.objects.filter(pj_leader='li1')[1].pj_name
聚合查询
聚合操作就是对数据库的
数值类型
操作的方法
- aggregate
- QuerySet对象的API
- 不会使用该模型的主键进行group by分组
- 返回字典
Table.object.all().aggregate(Count(字段))
- annotate
# 以name分组统计
Projects.objects.values('name').annotate(num=Count('name'))
Projects.objects.values_list('name').annotate(num=Count('name'))
# 聚合分组----统计项目名称以"项目5"开头的各个项目的个数
# SELECT name, COUNT(name) AS num FROM tb_projects WHERE name REGEXP BINARY '^项目5' GROUP BY name;
Projects.objects.filter(name__regex='^项目5').values('name').annotate(num=Count('name'))
2.3 U(update)
查询集不能使用save()方法,因此需要转换。否则会报错
'QuerySet' object has no attribute 'save'
# 方式一
res = Projects.objects.get(id=1)
res.name = '项目444'
res.save()
# 方式二--查询集
Projects.objects.filter(id=1).update(name='项目555')
return HttpResponse("<h1>Hello,Django GET</h1>")
2.4 D(delete)
res = Projects.objects.filter(pj_name='项目003').first()
res.delete()
2.5 order_by
- 单字段排序
默认从小到大排序,"-"标识从大到小排序
Projects.objects.all().order_by('id')
Projects.objects.all().order_by('-id')
- 多字段排序
使用两个字段进行排序:优先使用第一个字段排序
res = Projects.objects.all().order_by('pj_leader', '-id')
- 默认排序
默认使用创建类中ordering字段进行排序
class Meta:
ordering = ['pj_leader']
2.6 view 增删查改
from django.views import View
from projects.models import Projects
from django.http import HttpResponse
from django.db.models import Count
class ProjectView(View):
""""
类视图
"""
@staticmethod
def post(request, pk=None):
"""新增"""
for i in range(1, 10):
Projects.objects.create(name='项目{}'.format(i), leader='风清扬', developer='任我行',
tester='令狐冲', app_name='葵花宝典', desc='欲练此功 必先自宫')
return HttpResponse("创建成功")
@staticmethod
def get(request, pk=None):
"""查看"""
# res = Projects.objects.all()
# 统计项目名称以"项目5"开头的项目个数
# SELECT COUNT(name) AS num FROM tb_projects WHERE name REGEXP BINARY '^项目5';
# res = Projects.objects.filter(name__regex='^项目5').count()
# 聚合分组----统计项目名称以"项目5"开头的各个项目的个数
# SELECT name, COUNT(name) AS num FROM tb_projects WHERE name REGEXP BINARY '^项目5' GROUP BY name;
if pk:
res = Projects.objects.filter(id=pk)
else:
res = Projects.objects.all()
# res = Projects.objects.values('name').annotate(num=Count('name'))
return HttpResponse(res)
@staticmethod
def put(request, pk=1):
"""修改"""
Projects.objects.filter(id=pk).update(name='项目0000')
return HttpResponse('更新成功')
@staticmethod
def delete(request):
"""删除"""
# Projects.objects.all().delete()
Projects.objects.filter(id=3).delete()
return HttpResponse('删除成功')
# urls.py
from django.urls import path
from projects import views
urlpatterns = [
path(r'projects/<int:pk>', views.ProjectView.as_view()),
path(r'projects/', views.ProjectView.as_view()),
]
3. admin后台配置
3.1 创建管理员
- 方式一
# 创建后台管理员,输入用户名(username),邮箱(Email),密码(password),再次输入密码
/Users/whtest/.virtualenvs/djangoweb/bin/python manage.py createsuperuser
- 方式二:
# 先进入manage.py命令行,后执行: createsuperuser
3.2 展示配置
# admin.py
from django.contrib import admin
from projects.models import Projects
class ProjectsAdmin(admin.ModelAdmin):
"""
指定后台站点管理类
"""
# 指定新增/编辑时要展示的字段
fields = ('name', 'leader', 'developer', 'tester', 'app_name', 'desc')
# 指定列表字段
list_display = ['id', 'name', 'leader', 'developer', 'tester', 'app_name', 'desc']
admin.site.register(Projects, ProjectsAdmin)