文章目录
MySQL配置:
在setting中修改:
MySQL数据库配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'vueshop', #你的数据库名称
'USER': 'root', #你的数据库用户名
'PASSWORD': '123456', #你的数据库密码
'HOST': '', #你的数据库主机,留空默认为localhost
'PORT': '3306', #你的数据库端口
# 数据库引擎
# 'OPTIONS': {
#
# "init_command": "SET foreign_key_checks = 0;",
#
# }#加入这个在setting.py文件中数据库配置中
'OPTIONS': {'init_command': 'SET default_storage_engine=INNODB;'}
}
}
数据库创建好了我们就要创建模型类
创建模型类
模型类需要继承models.MOdel,虽然Django有邮箱的验证但是我们也要对邮箱进行验证
Django会自动生成我们的主键 在字段中使用primary_key=True 是设置为主键
from django.db import models
class Message(models.Model):
name=models.CharField(max_length=20,verbose_name="姓名")
email=models.EmailField(verbose_name="邮箱")
address=models.CharField(max_length=100,verbose_name="联系地址")
message=models.TextField(verbose_name="留言信息")
class Meta:
# 定义了表的信息
verbose_name="留言信息"
# 后台管理中会显示的信息
verbose_name_plural=verbose_name
#创建表的时候给的名
# db_table="my_message"
数据库我们也配置好了, 模型类我们也配置好了,接下来在数据库中生成表
使用AbstractUser重构user表
当我们需要一个user表的时候可以继承AbstractUser
from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.
GEDER_CHOICES=(
("male","男"),
("female","女")
)
class UserProfile(AbstractUser):
nick_name=models.CharField(max_length=50,verbose_name="昵称",default="")
birthday=models.DateField(verbose_name="生日",null=True,blank=True)
gender=models.CharField(verbose_name="性别",choices=GEDER_CHOICES,max_length=6)
address=models.CharField(max_length=100,verbose_name="地址",default="")
image=models.ImageField(upload_to="head_image/%Y/%m",default="default.jpg")
models=models.CharField(verbose_name="手机号码",max_length=11,unique=True)
class Meta:
# 定义了表的信息
verbose_name = "用户信息"
# 后台管理中会显示的信息
verbose_name_plural = verbose_name
def __str__(self):
if self.nick_name:
return self.nick_name
else:
return self.username
怎么获取重构user的model
from django.contrib.auth import get_user_model
User = get_user_model()
重构的模型类怎么生成表
需要在settings中导入当前的app然后还需添加这个就可以了
还需要在setting中添加
AUTH_USER_MODEL="users.UserProfile"
每个类的都有一个共同的字段时,我们可以创建一个父类
创建父类模型类
使用这个类注意循环引用,我选择了一个不会导入其他模型类的app的model
class BaseModel(models.Model):
add_time = models.DateTimeField(default=datetime.now, verbose_name="添加时间")
# datetime.now()不调用的原因是实例化的时候不会马上调用now()
class Meda:
abstract=True
想使用这个父类里面的字段我们可以继承父类
需要将这个父类导入进来
from users.models import BaseModel
class CourseResource(BaseModel):
course=models.ForeignKey(Lesson,on_delete=models.CASCADE,verbose_name="课程")
name=models.CharField(max_length=100,verbose_name="名称")
file=models.FileField(max_length=200,upload_to="course/resourse/%Y/%m",verbose_name="下载地址")
class Meta:
verbose_name = "课程资源"
verbose_name_plural = verbose_name
模型类如何使用联合唯一验证(同一张表不会出现重复的信息)
什么是联合唯一验证:
同一张表不会出现重复的信息
应用场景:比如用户的收藏表,一个用户不能对一个商品反复收藏这个时候我们就可以用到这个
用法:
在Meta中使用unique_together 将不能出现重复的字段进行绑定
class UserFav(models.Model):
"""
用户收藏
"""
user = models.ForeignKey(User, verbose_name="用户",on_delete=models.CASCADE)
goods = models.ForeignKey(Goods, verbose_name="商品", help_text="商品id",on_delete=models.CASCADE)
add_time = models.DateTimeField(default=datetime.now, verbose_name="添加时间")
class Meta:
verbose_name = '用户收藏'
verbose_name_plural = verbose_name
unique_together = ("user", "goods")
模型类字段总结
主键
models.ForeignKey(City,on_delete=models.CASCADE,verbose_name="所在城市")
第一个参数另一个模型类名,
on_delete=models.CASCADE 相关数据删除时,这条记录改怎么办CASCADE(删除)
CharField
# 字符串类型
models.CharField(max_length=50,verbose_name="昵称",default="")
max_length:必须传的参数
verbose_name:
default="" 默认为空
unique=True 保证的数据唯一性
null=True 可以为空,配合blank使用
blank=True
DateField/DateTimeField
# 时间类型由用户填写的时间
models.DateField(verbose_name="生日",null=True,blank=True)
#时间类型,自动默认系统时间
models.DateTimeField(default=datetime.now, verbose_name="添加时间")
# datetime.now()不调用的原因是实例化的时候不会马上调用now()
ImageField
models.ImageField(upload_to="head_image/%Y/%m",default="default.jpg")
#upload_to 必传参数,是文件存放的相对路径
max_length: 传不传都可以
反向查询
ForeignKey
使用related_name就可以反向查询
#外键
#related_name:CourseOrg表里面能通过related_name反向获取
couser_org=models.ForeignKey(CourseOrg,null=True,blank=True,on_delete=models.CASCADE, verbose_name="课程",related_name='courses')
#实例
#查询主表,如何反向获取外键所有的数据:
all_orgs=CourseOrg.objects.all()
#通过主表.外键related_name的值.all()获取外键所有的信息
all_orgs[0].courses.all()
#结果:
<QuerySet [<Course: python如何从门到入土>]>
或者在主表的model类定义函数:
主表model:
class CourseOrg(BaseModel):
name = models.CharField(max_length=50, verbose_name="机构名称")
desc = models.TextField(verbose_name="描述")
class Meta:
verbose_name = "课程机构"
verbose_name_plural = verbose_name
def courses(self):
#course外键表的类名首字母小写
courses = self.course_set.all()
return courses
使用MySQL数据库生成表
注意:Django2只支持MySQL5.5以上的版本
升级MySQL数据库可以去看看我总结的这个博客
MySQL安装教程
我们需要下载一个mysqlclient
也可以在终端直接使用pip下载
如果下载出了问题就使用这个方法
去这里下载第三包:https://www.lfd.uci.edu/~gohlke/pythonlibs/
收获搜索要下载的第三方包
下载下来后保存在一个没有中文路径下
在终端中使用pip install
到这里MySQL就配置完成了,创建完模型类后去生成迁移文件和执行迁移文件就可以生成表了
然后我们在终端中输入以下命令
生成数据库迁移文件
python manage.py makemigrations
执行数据库迁移文件
python manage.py migrate
使用Django自带的sqlite3数据库生成表
使用pycharm的一个可视化工具
就可看到我们的表就创建成功了
Mysql数据库的增删改查
查询:
需要导入模型类:
from apps.message_form.models import Message
# 获得结果集
all_message=Message.objects.all()
# 切面操作,打印了可以看到sql语句加上了limit
sliced_query = Message.objects.all()[:1]
#查看sql语句
print(all_message.query)
print(sliced_query.query)
# 过滤filter返回的是结果集
all_memssage=Message.objects.filter(name="笑得好虚伪")
# get返回的是一个对象当没有数据或者多条数据都会报异常
sliced_query =Message.objects.get(name="笑得好虚伪")
删
# 删除所有的查询结果集
all_message=Message.objects.all()
all_message.delete()
# 删除所有的查询对象
sliced_query =Message.objects.get(name="笑得好虚伪")
sliced_query .delete()
增
实例化模型类,提交使用save
如果主键存在是更新,不存在是添加
message=Message()
message.name="爱慕虚荣"
message.save()
表单校验后如何保存数据
userask_form=AddAskForm(request.POST)
if not userask_form.is_valid():
dict_response["status"]="fail"
print(userask_form.errors)
dict_response["msg"]="保存失败"
else:
# save:是保存数据 ,commit:将数据提交到数据库,返回的参数是form表单中模型类的实例
userask_form.save(commit=True)
排序
默认为升序
-为降序
all_orgs=CourseOrg.objects.all()
all_orgs=all_orgs.order_by("-students")
django在其他文件使用app的model的相关配置
我们需要在当前使用app的model下进行以下配置:
# 如何独立使用django的model
import sys
import os
pwd=os.path.dirname(os.path.realpath(__file__))
sys.path.append(pwd+"../")
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'vueshop.settings')
import django
django.setup()
#导入要使用的model:
from goods.models import GoodsCategory
from db_tools.data.category_data import row_data
all_categorys=GoodsCategory.objects.all()