django models.py(python和django)

本人java10年开发经验,现就职于电信,因工作需要学习python,记录自己的学习记录。后面也会持续分享真实工作经验,及项目。欢迎大家互关,一起学习!!文章有不严谨的地方请指出1.创建模型类打开pay应用的models.py创建模型类fromdatetimeimportdatetimefromdjango.dbimportmodels#Createyourmodelshere.#创建品牌的模型类classBrand(models.Model):#创建字段

大家好,又见面了,我是你们的朋友全栈君。

免费分享,平时搬砖,周末会录制匹配的视频。
配套视频地址:https

1.创建模型类

打开pay应用的models.py创建模型类

from datetime import datetime
from django.db import models

# Create your models here.
# 创建品牌的模型类
class Brand(models.Model):
    # 创建字段,字段类型...
    name = models.CharField(max_length=20, verbose_name='名称')
    add_time = models.DateTimeField(default=datetime.now, verbose_name="添加时间")
    is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')

    class Meta:
        db_table = 'brand'  # 指明数据库表名
        verbose_name = '分类'  # 在admin站点中显示的名称

    def __str__(self):  # self代表当前对象 相当于java的this
        """定义每个数据对象的显示信息,相当于java的toString方法"""
        return self.name    

# 创建商品的模型类
class Goods(models.Model):
    GENDER_CHOICES = (  # 数据库存储为0跟1 待会查询出来的时候,对象就会替换为后面的value
        (0, '上架'),
        (1, '下架')
    )
    name = models.CharField(max_length=20, verbose_name='名称')
    status = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name='状态')
    description = models.CharField(max_length=200, null=True, verbose_name='描述信息')
    brand = models.ForeignKey(Brand, on_delete=models.CASCADE, verbose_name='品牌')  # 外键
    is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')

    class Meta:
        db_table = 'goods'
        verbose_name = '商品信息'

    def __str__(self):
        return self.name

修改站点admin.py

from django.contrib import admin
from .models import Goods, Brand

# Register your models here.

admin.site.register(Brand)
admin.site.register(Goods)

1) 数据库表名

模型类如果未指明表名,Django默认以小写app应用名_小写模型类名为数据库表名。

可通过db_table指明数据库表名。

2) 关于主键

django会为表创建自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后django不会再创建自动增长的主键列。

默认创建的主键列属性为id,可以使用pk代替,pk全拼为primary key。

生成迁移文件
python manage.py makemigrations
同步到数据库中
python manage.py migrate

创建测试数据:

INSERT INTO brand(NAME,add_time,is_delete) VALUES('手机',NOW(),0)
,('电脑',NOW(),0),('衣服',NOW(),0),('鞋子',NOW(),0),('生活用品',NOW(),0)



INSERT INTO goods(NAME,STATUS,description,is_delete,brand_id)
VALUES('华为',0,'华为手机就是牛',0,1),('小米',0,'小米手机天下第一',0,1)
,('联想',0,'联想',0,1),('七匹狼',0,'七匹狼',0,1),('鬼冢',0,'aaaa',0,1)
,('拖把',0,'aaaa',0,1)

2.shell工具增删改查

打开pycharm输入

python manage.py shell 

2.1增

在这里插入图片描述

create方法也可以增加数据

在这里插入图片描述

2.2修改

在这里插入图片描述

也可以这样改

在这里插入图片描述

2.3删除

在这里插入图片描述

2.4查询

get查询单一结果,如果不存在会抛出模型类.DoesNotExist异常。

在这里插入图片描述

all查询多个结果。

count统计个数。

在这里插入图片描述

mysql的where功能

filter过滤出多个结果
exclude排除掉符合条件剩下的结果
get过滤单一结果

例如:查询编号为1的品牌

Brand.objects.filter(id__exact=1)   (exact表示相等的意思,两个下划线__)
可简写为:
Brand.objects.filter(id=1)

查询id不为2的记录
Brand.objects.exclude(id=2)

mysql中like的功能:

contains:是否包含。 如果要包含%无需转义,直接写即可。

例如:

查询品牌名字中包含'电'的记录
Brand.objects.filter(name__contains='电')
查询品牌名字中以'电'开头的
Brand.objects.filter(name__startwith='电')
查询品牌名字中以'脑'结尾的
Brand.objects.filter(name__endwith='电')
不区分大小写就在前面+i    icontains  istartwith iendwith iexact等

mysql中null的功能

查询品牌名字为null的记录
Brand.objects.filter(name__isnull=True)   不为null就是等于false

mysql中in的功能

查询品牌id为2 4 的
Brand.objects.filter(id__in=[2,4])

mysql中比较查询

gt大于 (greater then)
gte大于等于 (greater then equal)
lt小于 (less then)
lte小于等于 (less then equal)


例如:
查询品牌id大于2的记录
Brand.objects.filter(id__gt=2)

mysql的日期查询

year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算。

例如:查询2021年添加的品牌
Brand.objects.filter(add_time__year='2021')
查询2021年10月1日后添加的品牌
Brand.objects.filter(add_time__gt='2021-10-01')

2.5比较属性

为了方便测试为goods表添加总数量跟库存

为实体类添加字段
quantity = models.IntegerField(default=0, verbose_name="库存")
totalCount = models.IntegerField(default=0, verbose_name="总数量")
生成迁移文件
python manage.py makemigrations
同步到数据库中
python manage.py migrate

查询总数量大于库存的商品

在这里插入图片描述

2.6sql中的and、or

在这里插入图片描述

2.7mysql的聚合函数

使用aggregate()过滤器调用聚合函数。聚合函数包括:Avg平均,Count数量,Max最大,Min最小,Sum求和

例如:查询所有商品的总数量

在这里插入图片描述

2.8mysql中的排序

在这里插入图片描述

2.9关联查询

回顾一下表与表的关系,goods表有外键 brand关联品牌表

from datetime import datetime
from django.db import models


# Create your models here.
# 创建品牌的模型类
class Brand(models.Model):
    # 创建字段,字段类型...
    name = models.CharField(max_length=20, verbose_name='名称')
    add_time = models.DateTimeField(default=datetime.now, verbose_name="添加时间")
    is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')

    class Meta:
        db_table = 'brand'  # 指明数据库表名
        verbose_name = '分类'  # 在admin站点中显示的名称

    def __str__(self):  # self代表当前对象 相当于java的this
        """定义每个数据对象的显示信息,相当于java的toString方法"""
        return self.name


# 创建商品的模型类
class Goods(models.Model):
    GENDER_CHOICES = (  # 数据库存储为0跟1 待会查询出来的时候,对象就会替换为后面的value
        (0, '上架'),
        (1, '下架')
    )
    name = models.CharField(max_length=20, verbose_name='名称')
    status = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name='状态')
    description = models.CharField(max_length=200, null=True, verbose_name='描述信息')
    brand = models.ForeignKey(Brand, on_delete=models.CASCADE, verbose_name='品牌')  # 外键
    is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')
    quantity = models.IntegerField(default=0, verbose_name="库存")
    totalCount = models.IntegerField(default=0, verbose_name="总数量")

    class Meta:
        db_table = 'goods'
        verbose_name = '商品信息'

    def __str__(self):
        return self.name

关联查询例子:
在这里插入图片描述

3.其它操作

3.1querySet惰性与查看sql

querySet是惰性操作,只有真正使用时候才会发送sql
例如:
goods = Goods.objects.all():不会发送sql(注意数据不一致,因为你写这个sql的时候没发出去,用的时候发出去,可能在这期间数据已经改变了)
print(goods)才会发送sql
可以通过print(goods.query)查看发出的sql语句 帮助调试

3.2get_or_create

直接插入数据可能会冲突
Goods.objects.get_or_create(id=20,brand_id=1)  首先尝试获取,不存在就创建,可以防止重复 
返回(object, True/False)   true表示创建成功 false表示数据库已经存在该数据
类似的还有update_or_create

3.3切片操作

在这里插入图片描述

3.4querySet迭代判断

在这里插入图片描述

3.5querySet去重distinct

在这里插入图片描述

3.6查询某些字段values_list/values

方便查看 修改__str__方法为:

 def __str__(self):
        return '商品名字:%s,描述:%s' % (self.name,self.description)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.7排除不需要的字段,减少mysqlO

在这里插入图片描述

3.8选择需要的字段only

在这里插入图片描述

3.9n+1问题

select_related:实用一对一,多对一关系

直接join sql比较简单请自己看

在这里插入图片描述

prefetch_related:适用于多对多,一对多情况

是在第一次使用的时候发送

select * from goods where brand_id in(1,2,3,4,5)

因为多对多(比如A表5条对B表5条,join中间表就会是5*5),中间表就会冗余A表每条记录4次 ,而用in的话只需要查B表字段 A表就不会冗余 减少中间表的大小,节约内存

在这里插入图片描述

在这里插入图片描述

可以加微信群交流学习,相互内推
在这里插入图片描述
上一篇django入门(一)
下一篇 django入门(三)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/129300.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 带通滤波器幅频特性曲线图_滤波器知识,你所要的,都在这里

    带通滤波器幅频特性曲线图_滤波器知识,你所要的,都在这里滤波器是一种选频装置,可以使信号中特定的频率成分通过,而极大地衰减其它频率成分。一、概述1、定义凡是可以使信号中特定的频率成分通过,而极大地衰减或抑制其他频率成分的装置或系统都称之为滤波器,相当于频率“筛子”。2、分类频率通带:能通过滤波器的频率范围。频率阻带:被滤波器抑制或极大地衰减的信号频率范围。截止频率:通带与阻带的交界点。2)按物理原理分:机械式、电路式;按处理信号分:模拟、数字3、滤波…

  • pycharm 字体设置_pycharm另存为文件

    pycharm 字体设置_pycharm另存为文件1.步骤为:File–>Settings–>Appearance&Behavior–>Appearance–>Theme中就可以选择喜欢的主题2.一般将文件的保存格式默认设置为UTF-8,就不会出现乱码啦!步骤为:File–>Settings–>Editor–>FileandCodeTemplates–>选择Pyth…

  • Kali 更新源(国内镜像)

    Kali 更新源(国内镜像)1.更新软件源sudovim/etc/apt/sources.list2.选择比较合适的源(选择一个即可)#中科大debhttp://mirrors.ustc.edu.cn/kalikali-rollingmainnon-freecontribdeb-srchttp://mirrors.ustc.edu.cn/kalikali-rollingmainnon-freecontrib#阿里云debhttp://mirrors.aliyun.com/kalikali-ro

  • vs2013下载及安装教程_vs 2013

    vs2013下载及安装教程_vs 2013下面是VS2013对的网盘分享链接:https://pan.baidu.com/s/1K3BRe9TwM5RT5VujeRXx1w提取码:2yd6复制这段内容后打开百度网盘手机App,操作更方便哦下面是安装步骤链接:https://pan.baidu.com/s/1DBctGcVa-Tj3IAR44L6lEA提取码:zaag复制这段内容后打开百度网盘手机App,操作更方便哦…

  • rabbitmq下载安装教程_rabbitmq官方教程中文

    rabbitmq下载安装教程_rabbitmq官方教程中文RabbitMq安装教程RabbitMq简介安装准备工具RabbitMq简介##1.1消息队列中间件简介消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题实现高性能,高可用,可伸缩和最终一致性[架构]使用较多的消息队列有ActiveMQ(安全),RabbitMQ,ZeroMQ,Kafka(大数据),MetaMQ,RocketMQ以下介绍消息队列在实际应用中常用的使用场景:异步处理,应用解耦,流量削锋和消息通讯四个场景1.2什么是RabbitMQ RabbitM

  • PhpStorm中terminal窗口字体修改

    PhpStorm中terminal窗口字体修改

    2021年10月30日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号