django 数据库的CRUD(增删改查) django-shell 异常 结果集QuerySet 分页处理 聚合及统计 事务处理

from django.db import models


class CommonModel(models.Model):
    """ 自定义模型的基类 """
    created_at = models.DateTimeField('添加时间', auto_now_add=True)
    updated_at = models.DateTimeField('最后修改时间', auto_now=True)

    class Meta:
        # 抽象类,这个类,并不会生成对应的数据库表
        abstract = True


class User(CommonModel):
    """ 用户基本信息 """
    USER_STATUS = (
        (1, '正常'),
        (0, '删除'),
    )
    username = models.CharField('用户名', max_length=128, unique=True)
    password = models.CharField('密码', max_length=256)
    nickname = models.CharField('用户昵称', max_length=256, null=True, blank=True)
    avatar = models.ImageField('用户头像', upload_to='avatar', null=True, blank=True)
    status = models.SmallIntegerField('用户状态', default=1, choices=USER_STATUS)
    is_super = models.BooleanField('是否为超级用户', default=False)
    created_at = models.DateTimeField('注册时间', auto_now_add=True)
    updated_at = models.DateTimeField('更新时间', auto_now=True)

    class Meta:
        db_table = 'accounts_user'

    def __str__(self):
        return 'User: {}'.format(self.username)


class UserProfile(CommonModel):
    """ 用户详细信息 """
    SEX_CHOICES = (
        (0, '未知'),
        (1, '男'),
        (2, '女'),
    )
    user = models.OneToOneField(User, verbose_name='关联用户',
                                related_name='profile',
                                on_delete=models.CASCADE)
    username = models.CharField('用户名', max_length=128, unique=True)
    real_name = models.CharField('真实姓名', max_length=128, null=True, blank=True)
    sex = models.SmallIntegerField('用户性别', default=0, choices=SEX_CHOICES)
    maxim = models.CharField('用户格言', max_length=128, null=True, blank=True)
    address = models.CharField('用户地址', max_length=128, null=True, blank=True)

    class Meta:
        db_table = 'accounts_user_profile'


class LoginHistory(models.Model):
    """ 用户的登录历史 """
    user = models.ForeignKey(User, related_name='login_history_list',
                             on_delete=models.CASCADE,
                             verbose_name='关联的用户')
    username = models.CharField('用户名', max_length=128)
    login_type = models.CharField('账号平台', max_length=128)
    ip = models.CharField('IP地址', max_length=32, default='')
    ua = models.CharField('登录来源', max_length=128, default='')
    created_at = models.DateTimeField('登录时间', auto_now_add=True)

    class Meta:
        db_table = 'accounts_login_history'
        ordering = ['-created_at']

django-she:

进入后使用User模型

pyCharm 进入比较好有代码提示

    obja2 = Slider(id=14, name='支付宝单透', desc=1, page_mark='2',
                   types=2, img=r'/static/home/hot/h3.png',
                   reorder=1, is_valid=1, )
    obja3 = Slider(id=15, name='支付宝秒抢', desc=1, page_mark='2',
                   types=2, img=r'/static/home/hot/h3.png',
                   reorder=1, is_valid=1, )
    obja4 = Slider(id=16, name='号码压力测试', desc=1, page_mark='2',
                   types=2, img=r'/static/home/hot/h6.jpeg',
                   reorder=1, is_valid=1, )
    obja5 = Slider(id=17, name='诚讯', desc=1, page_mark='2',
                   types=2, img=r'/static/home/hot/h8.jpeg',
                   reorder=1, is_valid=1, )
    obja6 = Slider(id=18, name='QQ系列', desc=1, page_mark='2',
                   types=2, img=r'/static/home/hot/h10.jpeg',
                   reorder=1, is_valid=1, )
    obja7 = Slider(id=19, name='会合系列', desc=1, page_mark='2',
                   types=2, img=r'/static/home/hot/huihe.jpeg',
                   reorder=1, is_valid=1, )
    obja8 = Slider(id=20, name='友讯', desc=1, page_mark='2',
                   types=2, img=r'/static/home/hot/h4.jpeg',
                   reorder=1, is_valid=1, )
    obja9 = Slider(id=21, name='德迅系列', desc=1, page_mark='2',
                   types=2, img=r'/static/home/hot/h7.jpeg',
                   reorder=1, is_valid=1, )
    obj_list = [obja2,
                 obja3,
                 obja4,
                 obja5,
                 obja6,
                 obja7,
                 obja8,
                 obja9
                 ]
    Slider.objects.bulk_create(obj_list)

插入操作:

 

ORM简单查询:

异常:

 

查询如果没有就创建:

存在:

查询所有数据:

 

 

使用:

修改数据:

删除操作:

 

ALL删除:

  结果集QuerySet:

惰性:每次使用的时候才回去数据库找!

结果集条件判断:

 

 

链式查询:

等于1

不等于1

模型管理器(Manager):

调试技巧:

 

查询条件判断  :

布尔判断:

是否包含某个字符串查找:

__in---是否包含:

时间日期查询:

外键关联查询:

按多个条件查询:

Q函数:

查询优化:

django-debug-toolbar使用:

 去官网查看使用条件:https://django-debug-toolbar.readthedocs.io/en/latest/installation.html

1.

2.

3.

4.

分页处理 使用Paginator:

def user_list_paginator(request):
    """ 分页-使用分页器 """
    page = request.GET.get('page', 1)
    user_list = User.objects.all()
    # 第一步,取得分页器
    p = Paginator(user_list, 15)
    # 第二步,取得某一页的对象(实例)
    # page_data = p.get_page(page)
    try:
        page_data = p.page(page)
    except EmptyPage as e:
        print('页面不存在')
        raise Http404
    except PageNotAnInteger as e:
        print('无效的页码')
        raise Http404

    return render(request, 'user_list_paginator.html', {
        'page_data': page_data
    })

from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.db.models import Q
from django.http import Http404
from django.shortcuts import render

# Create your views here.
from django.views.generic import ListView

from accounts.models import User, UserProfile


def query_course(request):
    c = request.GET.get('c', None)
    query = Q()
    if c is not None:
        query = query & Q()
    sort = request.GET.get('sort', None)
    if sort is not None:
        query = query & Q()


def user_info(request):
    """ 用户详情-查询优化 """
    user = User.objects.get(pk=1)
    # profile_list = UserProfile.objects.all()
    profile_list = UserProfile.objects.all().select_related('user')

    # 使用SQL查询
    user_list = User.objects.raw('SELECT * FROM  `accounts_user`')
    return render(request, 'user_info.html', {
        'user': user,
        'profile_list': profile_list,
        'user_list': user_list
    })


def user_list_slice(request):
    """ 分页-使用切片 """
    page = request.GET.get('page', 1)
    try:
        page = int(page)
    except:
        # 出现异常默认设置为第一页
        page = 1
    # 每页放多少条数据
    page_size = 10
    # user_list = User.objects.all()[0: 10]
    # user_list = User.objects.all()[10: 20]
    start = (page - 1) * page_size
    end = page * page_size
    user_list = User.objects.all()[start: end]
    return render(request, 'user_list_slice.html', {
        'user_list': user_list
    })


def user_list_paginator(request):
    """ 分页-使用分页器 """
    page = request.GET.get('page', 1)
    user_list = User.objects.all()
    # 第一步,取得分页器
    p = Paginator(user_list, 15)
    # 第二步,取得某一页的对象(实例)
    # page_data = p.get_page(page)
    try:
        page_data = p.page(page)
    except EmptyPage as e:
        print('页面不存在')
        raise Http404
    except PageNotAnInteger as e:
        print('无效的页码')
        raise Http404

    return render(request, 'user_list_paginator.html', {
        'page_data': page_data
    })


class UserListView(ListView):
    """ 分页处理, 面向对象 """
    # 对应的模板
    template_name = 'user_list_class.html'
    # 对应的ORM模型
    model = User
    # 页面大小
    paginate_by = 20
    # 获取页面的参数(当期第几页)
    page_kwarg = 'p'

分页异常:

ListView分页:

class UserListView(ListView):
    """ 分页处理, 面向对象 """
    # 对应的模板
    template_name = 'user_list_class.html'
    # 对应的ORM模型
    model = User
    # 页面大小
    paginate_by = 20
    # 获取页面的参数(当期第几页)
    page_kwarg = 'p'

聚合及统计:

aggregate从整个查询结果集生成统计数据:

 

数据一致性:

    F()函数作用:

   

事物处理:

 

def user_register(request):
    """ 用户注册 """
    # 1. 获取表单的数据
    # 2. 验证数据是否符合要求
    # 3. 添加用户信息(用户基本信息、详细信息)
    username = '13000000002'
    try:
        user = User.objects.create(username=username,
                                   password='123456',
                                   nickname='王五')
        # profile = UserProfile.objects.create(user=user, username=username)
        profile = UserProfile.objects.create(user=user, usernamex=username)
        # 4. 反馈结果:成功/失败
        return HttpResponse('ok')
    except Exception as e:
        user.delete()
        print(e)
        return HttpResponse('no')


@transaction.atomic()
def user_signup_trans(request):
    """ 事务的使用-装饰器 """
    username = '13000000003'
    user = User.objects.create(username=username,
                               password='123456',
                               nickname='王五')
    profile = UserProfile.objects.create(user=user, usernamex=username)
    return HttpResponse('ok')


def user_signup_trans_with(request):
    """ 事务的使用-with语法"""
    with transaction.atomic():
        username = '13000000005'
        user = User.objects.create(username=username,
                                   password='123456',
                                   nickname='王五')
        profile = UserProfile.objects.create(user=user, usernamex=username)
    return HttpResponse('ok')


# @transaction.atomic()
def user_signup_trans_hand(request):
    """ 事务的自动提交 """
    username = '13000000007'
    # 放弃自动提交事务
    transaction.set_autocommit(False)
    try:
        user = User.objects.create(username=username,
                                   password='123456',
                                   nickname='王五')
        profile = UserProfile.objects.create(user=user, username=username)
        # profile = UserProfile.objects.create(user=user, usernamex=username)
        # 手动提交事务
        transaction.commit()
        # 4. 反馈结果:成功/失败
        return HttpResponse('ok')
    except Exception as e:
        # user.delete()
        print(e)
        # 手动控制事务,实现回滚
        transaction.rollback()
        return HttpResponse('no')

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值