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')