Django 数据库相关操作

     阅读:38

MySQL配置:

在setting中修改:
在这里插入图片描述
MySQL数据库配置
在这里插入图片描述

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', 
        'NAME': 'books',    #你的数据库名称
        'USER': 'root',   #你的数据库用户名
        'PASSWORD': '', #你的数据库密码
        'HOST': '', #你的数据库主机,留空默认为localhost
        'PORT': '3306', #你的数据库端口
    }
}

数据库创建好了我们就要创建模型类

创建模型类

模型类需要继承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

重构的模型类怎么生成表

需要在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

模型类字段总结

主键

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: 传不传都可以

使用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()