Django model相关操作

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()
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值