Django--003 ORM及admin后台配置

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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值