文章目录
练习源码(gitee):
https://gitee.com/yinjiangbing/django_study_model.git
前面了解了一下模板的使用和一些概念,下面就开始认识一下模型了
看下Django对模型的定义:
模型准确且唯一的描述了数据。它包含您储存的数据的重要字段和行为。一般来说,每一个模型都映射一张数据库表
每个模型都是一个 Python 的类,这些类继承 django.db.models.Model
模型类的每个属性都相当于一个数据库表的字段。
利用这些,Django 提供了一个自动生成访问数据库的 API
可以参考Django官网说明: Django官网说明
下面还是举实际例子吧。。。
在users下有一个models.py,也就是用户类的模型,这个是创建APP的时候就带着的,不用自己创建
接下来创建一个user类,然后让它去继承models.Model
class User(models.Model)
然后就市区创建它的字段,比如它有id,username、password、add_time
看下如何去创建id这个字段
username的创建为例:
username = models.CharField(max_length=12, unique=True, null=False, error_messages={'unique': '用户名必须唯一'})
CharField可以点进去查看它的底层代码,它是一个类,返回一个Filed
其中max_length代表这个字段的最大长度(必须要有这个值)
unique:是否唯一,True代表唯一
null=False:表示不允许为空
error_messages:错误信息(键值对出现)
class User(models.Model):
username = models.CharField(max_length=12, unique=True, null=False, error_messages={'unique': '用户名必须唯一'})
password = models.CharField(max_length=100, null=False)
phone = models.CharField(max_length=11)
# 注意:时间用的是DateTimeField
add_time = models.DateTimeField(default=datetime.now)
然后去返回一个想要的东西
我这里只返回了一个username,还可以返回去他的或者拼接
def __str__(self):
return self.username
下面还需要定义一个内部类Meta,这个内部类指定的是一个表名
默认表名是user,也可以自己指定表名(db_table=‘表名’)
这样我就把我的表名改成了userprofile
class Meta:
db_table = 'userprofile'
这就定义了一个简单的模型类(前提是不要忘记配置settings.py里的数据库)
from datetime import datetime
from django.db import models
# Create your models here.
class User(models.Model):
username = models.CharField(max_length=12, unique=True, null=False, error_messages={'unique': '用户名必须唯一'})
password = models.CharField(max_length=100, null=False)
phone = models.CharField(max_length=11)
add_time = models.DateTimeField(default=datetime.now)
def __str__(self):
return self.username
class Meta:
db_table = 'userprofile'
接下来要做的就是迁移同步,把数据同步到数据库里
命令:
# 迁移,这里只是把配置同步到了users下的makemigrations里面了,只是生成一个文件,还没同步到数据库
python manage.py makemigrations
# 同步,同步到数据库
python manage.py migrate
id是自动生成的
如果想改表名只要改db_table就行
再把表名改成user
class Meta:
db_table = 'user'
然后依次执行命令即可
python manage.py makemigrations
python manage.py migrate
添加表格字段也是这样操作
那接下来就把注册登录写进数据库
修改之前的register和login
在template下创建一个用户模型(user文件包)
将register和login放进去
base就直接放在template下了
下面通过例子来看下数据类型,
choices可选项:
先以商城的一个商品为例
我之前还创建了一个商品APP(goods),就直接把它拿过来用
然后同样在models.py里去编辑商品模型
然后去定义这个商品的名字,简介,价格,重量,数量,增值业务等
class Goods(models.Model):
name = models.CharField(max_length=100, null=False)
desc = models.CharField(max_length=300)
# 价格,保留小数点后2位
price = models.DecimalField(max_digits=6, decimal_places=2, null=False)
wight = models.DecimalField(max_digits=6, decimal_places=2)
store_num = models.IntegerField(default=100)
value_added = models.CharField(max_length=100, choices=(('frist', '业务1')('two', '业务2')))
数据库的添加有两种方法:
方法一:
user = User()
user.username = username
# user.password = password
# 对密码进行加密
user.password = hashlib.sha256(password.encode('utf-8')).hexdigest()
if phone:
user.phone = phone
user.save()
return HttpResponse('用户注册成功!')
方法二:
password = hashlib.sha256(password.encode('utf-8')).hexdigest()
user = User.objects.create(username=username, password=password, phone=phone)
if user:
return HttpResponse('用户注册成功!')
接下看下登录(数据库的查询):
在视图里创建登录函数,然后添加路由
# 用户登录
def login(request):
# post请求时需要做的处理
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
# 判断输入的用户是否存在
if username and password:
# 查询(注意:密码是加密的,用户名是唯一的,可以根据用户名查询)
user = User.objects.filter(username=username).first()
password = hashlib.sha256(password.encode('utf-8')).hexdigest()
# 如果用户存在的情况下执行下面的动作
if user:
if user.password == password:
return HttpResponse('用户登录成功!')
return render(request, 'user/login.html', {'msg': '用户名或者密码有误!'})
else:
return render(request, 'user/login.html', {'msg': '用户名或者密码不能为空!'})
return render(request, 'user/login.html')
这里查询可以使用filter()来查询,照例看下filter()的底层来做下了解:
def filter(self, *args, **kwargs):
"""
Return a new QuerySet instance with the args ANDed to the existing
set.
"""
self._not_support_combined_queries('filter')
return self._filter_or_exclude(False, args, kwargs)
可以看到它是返回一个new QuerySet(查询集),所以需要传参来获取指定值
User.objects.filter(username=username)
这样就实现了我的用户登录了
接下来看下如何实现登陆后显示我的登录信息
先创建一个show.html
{% extends 'base.html' %}
{% block title %}
所用用户
{% endblock %}
{% block mycss %}
<style>
#error{
color: red;
}
</style>
{% endblock %}
{% block content %}
<table class="table table-hover">
<tr>
<td>序号</td>
<td>用户名</td>
<td>手机号码</td>
<td>注册时间</td>
<td>操作</td>
</tr>
{% for user in users %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ user.username }}</td>
<td>{{ user.phone | default:'未注册' }}</td>
<td>{{ user.add_time }}</td>
<td>
<a href="">删除</a>
<a href="">修改</a>
</td>
</tr>
{% endfor %}
</table>
{% endblock %}
然后在视图里添加show函数,添加路由
# 展示页
def show(request):
# show需要查询所有的
users = User.objects.all()
return render(request, 'user/show.html', {'users': users})
show需要查询所有,这里有到了all()
User.objects.all()
这里想实现登陆成功后直接跳转到show页面,需要对login函数进行一下修改
运行结果:
样式可以自行改一下!