Django的模型

news2024/11/13 8:38:24

定义模型

from django.db import models
class User(models.Model):
	# 类属性是表示表的字段
    username = models.CharField(max_length=50,unique=True)
    password = models.CharField(max_length=200)
    create_time = models.DateTimeField(auto_now_add=True) # auto_now_add新增数据时间为系统当前时间,且后续操作该条数据时,此字段值不会更新
    update_time = models.DateTimeField(auto_now=True) #auto_now新增数据时间为系统当前时间,且后续操作该条数据时,此字段值会更新为系统当前时间
    money=models.DecimalField(max_digits=16,decimal_places=2,null=True)
    flag = models.BooleanField(False)
    class Meta:
        db_table="tb_users" # 定义表明
        ordering=["-create_time"] # 排序

激活模型

# 生成迁移文件
python manage.py makemigrations
# 迁移
python manage.py migrate
# 已经建好数据库,需要将数据库反向到项目中的models.py模块中生成模型类
python manage.py inspectdb > app/models.py

使用模型

增加数据

user = User(username="fds",password=MD5(b"1213").hexdigest())
user.save()
# 使用create增加删除,不需要save()方法
uses={"username":"ff","password":"123456"}
User.objects.create(**uses)
# 一次创建多条数据
User.objects.bulk_create([User(username="fdfd"),User(username="dfs")])

修改数据

user = User.objects.get(pk=1)
user.username="测试人员"
user.save()

删除数据

# 删除一条数据
 user = User.objects.get(pk=1)
   if user:
    user.delete()
# 根据条件过滤删除多条数据
user = User.objects.filter(pk__gte=3)
   if user:
    user.delete()
# 逻辑删除,将表中某个字段的值置为false
 user = User.objects.get(pk=1)
   if user:
    user.flag=True # 将该状态设置为true,表示无效
    user.save()

查询数据

从数据库查询数据,首先会获取到一个查询集queryset

管理器的方法返回类型说明
模型类.objects.all()QuerySet返回列表中所有的数据
模型类.objects.filter()QuerySet返回列表中符合条件的数据
模型类.objects.exclude()QuerySet返回不符合条件的数据
模型类.objects.order_by()QuerySet对查询结果集进行排序
模型类.objects.values()QuerySet返回的每一个对象为一个字典
模型类.objects.get()模型对象如果找不到数据会报错,找到多条也会报错
模型类.objects.first()模型对象返回第一条数据
模型类.objects.last()模型对象返回最后数据
模型类.objects.exist()bool判断查询到数据是否存在
模型类.objects.last()int返回查询集中对象的数目

查询结果返回查询集

查询结果集可以再次进行链式过滤,再查询结果集的基础上进行filter等操作

  • all()
 user = User.objects.all()
 # 返回结果,返回所有的数据
 <QuerySet [<User: User object (4)>, <User: User object (3)>, <User: User object (2)>]>
  • filter()
 user = User.objects.filter(pk__gte=1) # filter对应sql中的where语句
 # 返回结果,返回pk大于等于1 的数据
 <QuerySet [<User: User object (4)>, <User: User object (3)>, <User: User object (2)>]>
# 链式查询
 user = User.objects.filter(pk__gte=1).filter(username="fff") 
 # 返回结果
 <QuerySet [<User: User object (4)>]>
  • order_by()
# 根据创建时间倒序排序
user = User.objects.order_by("-create_time")
# 按照create_time升序排列
user = User.objects.order_by("create_time")
  • values()
# 不指定字段查询
user = User.objects.values()
# 返回结果
<QuerySet [{'id': 4, 'create_time': datetime.datetime(2023, 8, 20, 2, 2, 59, 302973, tzinfo=datetime.timezone.utc), 'update_time': datetime.datetime(202
3, 8, 20, 2, 2, 59, 302973, tzinfo=datetime.timezone.utc), 'username': 'shasha', 'password': '123456', 'money': None, 'flag': False}, {'id': 3, 'create_
time': datetime.datetime(2023, 8, 20, 2, 2, 50, 699239, tzinfo=datetime.timezone.utc), 'update_time': datetime.datetime(2023, 8, 20, 2, 2, 50, 699239, t
zinfo=datetime.timezone.utc), 'username': 'ff', 'password': '123456', 'money': None, 'flag': False}, {'id': 2, 'create_time': datetime.datetime(2023, 8,
 20, 1, 51, 8, 322158, tzinfo=datetime.timezone.utc), 'update_time': datetime.datetime(2023, 8, 20, 1, 56, 20, 989425, tzinfo=datetime.timezone.utc), 'u
sername': 'fsdf', 'password': '1111111', 'money': None, 'flag': False}]>

# 指定字段查询
user = User.objects.values("username")
# 返回结果
<QuerySet [{'username': 'shasha'}, {'username': 'ff'}, {'username': 'fsdf'}]>

查询结果返回对象

查询结果后面不能跟all()、filter()等字段进行过滤

  • first()
 user = User.objects.first()
 # 返回结果
 User object (4)

去重

# 使用distinct关键字去重
User.objects.all().values("password").distinct()

查询条数

查询记录数,查询结果集必须是queryset才能调用count()

User.objects.all().count()

判断结果是否为空

# 查询所有数据
User.objects.all().exists()
# 根据条件筛选出数据后判断数据是否为空
User.objects.filter(pk__lt=1).exists()

字段查询&运算符

属性名称__关系运算符=值
在这里插入图片描述

在这里插入图片描述

判断某个字段的值是否为空

# 查询money为空的结果
User.objects.filter(money__isnull=True)
# 返回结果
<QuerySet [<User: User object (4)>]>

精确判等

User.objects.filter(money__exact="100")

模糊查询

 User.objects.filter(username__contains="h")

查询在区间范围内的数据

User.objects.filter(money_range=[90,200])

日期查询

# 查询年份
User.objects.filter(create_time__year=2023)

统计查询

使用aggregate方法进行聚合查询,不分组统计查询数据

  • Max
# 查询到id的最大值
User.objects.aggregate(Max('pk'))

使用annotate方法进行分组统计查询数据

原生sql

User.objects.raw("select * from tb_users ")
# 返回结果
<RawQuerySet: select * from tb_users >

模型关系

一对一

外键设置在哪一方都可以,通过OneToOneField关键字设置关联关系

一对多

一般是将主表中的主键放到从表中做外键,外键一般是一对多中多的一方设置,通过ForeignKey关键字设置

class BookModel(models.Model):
    # 主表
    name =models.CharField(max_length=50,verbose_name="书名")
    price=models.IntegerField(verbose_name="价格")
    pub_date = models.DateField(verbose_name="时间")
    # 从主表查询从表的名字是通过related_name取的
    pub=models.ForeignKey('Publish',on_delete=models.CASCADE,related_name="books",null=True)
class Publish(models.Model):
    # 从表
    name=models.CharField(max_length=100)

从表操作主表,是通过在从表定义的外键进行操作的,对主表进行增删改查

   # 修改从表中外键的值
   book = BookModel.objects.get(pk=2)
   pub1 = Publish.objects.get(pk=1)
   book.pub=pub1 # 修改从表中外键的值,且外键的值pub1必须是一个对象
   book.save()

通过主表操作从表,利用在从表中定义的related_name的值操作从表,对从表进行增删改查

# 通过主表操作从表,给从表新增数据
  # 通过出版社操作图书
   pub = Publish.objects.get(pk=2)
   # 给pk=2增加几本书
   pub.books.create(name="fds11",price=22,pub_date='2023-09-01')
# 通过主表操作从表,更新从表中的数据
 # 通过出版社操作图书
   pub = Publish.objects.get(pk=2)
   # 给pk=2增加几本书
   pub.books.update(name="娃哈哈",price=22,pub_date='2023-09-01')
   book = BookModel.objects.get(pk=2)
   print(book.pub) # Publish object (1)
   # book.pub是Publish的对象
# 通过主表查询从表
   pub = Publish.objects.get(pk=2)
   # pub-books是一个查询管理器对象
   book = pub.books.all()
# 以从表字段作为过滤条件,查询主表中的数据
pub = Publish.objects.filter(books__name="娃哈哈")
# 返回查询结果
<QuerySet [<Publish: Publish object (2)>, <Publish: Publish object (2)>]>

多对多

通过ManyToManyField关键字设置多对多关系(商品和客户间的关系是多对多的关系)
注:一般要手动创建第三张表用来关联多对多的两张表

class Buyer(models.Model):
    name = models.CharField(max_length=50)
    leve = models.IntegerField(default=1)

    class Meta:
        db_table = "tb_buyer"

class Goods():
    name = models.CharField(max_length=50, verbose_name="名")
    price = models.IntegerField(verbose_name="价格")

    class Meta:
        db_table = "tb_goods"

# 多对多的关联的第三张表
class Order():
    buyer = models.ForeignKey("Buyer",on_delete=models.CASCADE)
    goods = models.ForeignKey("Goods", on_delete=models.CASCADE)
    num = models.IntegerField(default=1)
    class Meta:
        db_table="tb_order"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/902952.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

发布python模仿2023年全国职业的移动应用开发赛项样式开发的开源的新闻api,以及安卓接入案例代码

python模仿2023年全国职业的移动应用开发赛项样式开发的开源的新闻api&#xff0c;以及原生安卓接入案例代码案例 源码地址:keyxh/newsapi: python模仿2023年全国职业的移动应用开发赛项样式开发的开源的新闻api&#xff0c;以及安卓接入案例代码 (github.com) 目录 1.环境配…

全球地震分析寻找难以捉摸的前震信号

发现前震的本质可以帮助地震学家预测大地震。 2019 年里奇克莱斯特地震序列使南加州沙漠​​的道路发生偏移。图片来源&#xff1a;Ken Hudnut/USGS 小地震是否预示着大地震是地震学中长期存在的问题。 简而言之&#xff0c;答案是&#xff0c;有时他们会这样做。这是根据对全…

老胡的周刊(第104期)

老胡的信息周刊[1]&#xff0c;记录这周我看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。 &#x1f3af; 项目 whistle[2] Whistle 是基于 Node 实现的跨平…

点亮一颗LED灯

TOC LED0 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能APB2的外设时钟GPIO_InitTypeDef GPIO_Initstructure;GPIO_Initstructure.GPIO_Mode GPIO_Mode_Out_PP;//通用推挽输出GPIO_Initstructure.GPIO_Pin GPIO_Pin_5;GPIO_Initstructure.GPIO_Speed GPIO_S…

从LeakCanary看如何判断对象被回收了

前面已经了解了Service&#xff0c;Fragment&#xff0c;ViewModel对象的销毁时机&#xff0c;那么在触发销毁时机后&#xff0c;我们怎么判断这些对象有没有回收呢&#xff1f; 大家都知道在Java中有强引用&#xff0c;弱引用&#xff0c;软引用&#xff0c;虚引用四种引用方…

难缠客户背后的秘密:项目经理的危机处理手册

难缠的客户&#xff0c;每个项目经理都会或多或少遇到。他们可能会频繁更改需求&#xff0c;对细节吹毛求疵&#xff0c;或者在关键时刻提出与之前完全不同的意见。但是&#xff0c;难缠的客户其实并不都是坏事&#xff0c;他们也为项目经理提供了宝贵的学习机会。本文将深入探…

git拉取失败/git fatal终极解决方法

前言 被折磨不下20次总结出来的终极方案 步骤 0 首先关闭代理试试&#xff0c;不行就下一步 1 重置代理或者取消代理的方式 git config --global --unset http.proxy git config --global --unset https.proxy添加全局代理 git config --global http.proxy git config …

虚拟化 VMware sphere

一 VMware sphere用途&#xff1a; VMware vSphere 是 VMware 的虚拟化平台&#xff0c;可将数据中心转换为包括 CPU、存储和网络资源的聚合计算基础架构。vSphere 将这些基础架构作为一个统一的运行环境进行管理. 1. **虚拟化&#xff1a;** vSphere 的主要用途是将物理服务…

打印X型的图案

int main() {int n0;int i0;int j0;scanf("%d",&n);for(i0;i<n;i){for(j0;j<n;j){if(ij){printf("*");}else if((ij)n-1){printf("*");}elseprintf(" ");}printf("\n");}return 0; }

mapper.xml中循环执行多条语句时报错,但是单独拿SQL到数据库却可以执行

我是批量修改数据&#xff0c;用foreach标签包住update语句&#xff0c;报错信息如下&#xff1a; nested exception is java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the …

HCIP的VLAN实验

实验步骤&#xff1a; 1.首先&#xff0c;对交换机SW1进行操作&#xff0c;创建需要的VLAN并对接口进行划分 [SW1]vlan batch 2 to 6 [SW1]port-group group-member Ethernet 0/0/2 Ethernet 0/0/4 [SW1-port-group]port link-type access [SW1-port-group]port default vlan …

聚焦电力行业CentOS迁移,麒麟信安受邀参加第六届电力信息通信新技术大会暨数字化发展论坛并发表主题演讲

为加快推进“双碳”目标下的新型能源体系和新型电力系统建设&#xff0c;深化新一代数字技术与电力业务的融合发展&#xff0c;促进电力行业关键技术自主创新、安全可控&#xff0c;助力电力企业数字化转型升级和高质量发展&#xff0c;2023年8月9-11日&#xff0c;第六届电力信…

使用mysql:5.6和 owncloud 镜像,构建一个个人网盘。

一.根据自己版本选择镜像 uname -a cat /etc/centos-releaseuname -a 命令用于查看当前系统的硬件和操作系统信息&#xff0c;包括内核版本、处理器架构、系统类型等。 其中&#xff0c;"Linux" 表示操作系统类型为 Linux&#xff0c;"3.10.0-1160.el7.x86_64…

C++ 网络编程项目fastDFS分布式文件系统(四)-fastCGI项目相关技术以及linux搜狗输入法相关问题。

目录 1. Nginx作为web服务器处理请求 2. http协议复习 Get方式提交数据 Post方式提交数据 3. fastCGI 3.1 CGI 3.2 fastCGI 3.3 fastCGI和spawn-fcgi安装 1. 安装fastCGI 2. 安装spawn-fcgi 3.4 nginx && fastcgi 4其他知识点 1. fastCGI环境变量 - fas…

week5刷题

题解: 斐波那契数的边界条件是 F(0)0和 F(1)1。当 n>1 时&#xff0c;每一项的和都等于前两项的和&#xff0c;因此有如下递推关系&#xff1a; F(n)F(n−1)F(n−2) 由于斐波那契数存在递推关系&#xff0c;因此可以使用动态规划求解。动态规划的状态转移方程即为上述递推…

vector的迭代器失效问题

vector的迭代器存在一定隐患&#xff0c;以下几种方式会导致其迭代器失效 resize、reserve、insert、assign、push_back。 1.push_back导致迭代器失效 示例代码&#xff1a; #include<vector> #include <iostream> using std::cout; using std::endl; using std:…

PyTorch学习笔记(十六)——利用GPU训练

一、方式一 网络模型、损失函数、数据&#xff08;包括输入、标注&#xff09; 找到以上三种变量&#xff0c;调用它们的.cuda()&#xff0c;再返回即可 if torch.cuda.is_available():mynn mynn.cuda() if torch.cuda.is_available():loss_function loss_function.cuda(…

无涯教程-PHP - 预定义变量

PHP为它运行的脚本提供了预定义变量数组&#xff0c;其中包含来自Web服务器&#xff0c;环境和用户输入的变量。这些新数组称为超全局变量- PHP超全局变量 Sr.NoVariable & Description1 $GLOBALS 全局变量数组。 2 $_SERVER 存放提交过来的web路径、域名、来源、IP及各…

SQL助你面大厂(窗口函数)

在面试过程中窗口函数的应用可谓是数不胜数&#xff0c;前提你要知道什么是窗口函数&#xff0c;最常用的窗口函数有哪些&#xff1f;语法是什么&#xff1f;分别用的场景是什么&#xff1f;今天会以这三个问题开始我们今天的学习 什么是窗口函数&#xff1f; 所谓的窗口函数就…

C语言知识

C语言知识 链接 C语言中的数组初始化是有三种形式的&#xff0c;分别是&#xff1a; (1)数据类型 数组名称[长度n] {元素1,元素2…元素n}; (2)数据类型 数组名称[] {元素1,元素2…元素n}; (3)数据类型 数组名称[长度n]; 数组名称[0] 元素1; 数组名称[1] 元素2; 数组…