当前位置: 首页 > 编程日记 > 正文

Django 模型层(1)

回到顶部

ORM简介

  • MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的工作量,不需要面对因数据库变更而导致的无效劳动
  • ORM是“对象-关系-映射”的简称。

 View Code
回到顶部

单表操作

创建表

1  创建模型

创建名为book的app,在book下的models.py中创建模型:

复制代码
from django.db import models# Create your models here.class Book(models.Model):id=models.AutoField(primary_key=True)title=models.CharField(max_length=32)state=models.BooleanField()pub_date=models.DateField()price=models.DecimalField(max_digits=8,decimal_places=2)publish=models.CharField(max_length=32)
复制代码

2 更多字段和参数

每个字段有一些特有的参数,例如,CharField需要max_length参数来指定VARCHAR数据库字段的大小。还有一些适用于所有字段的通用参数。 这些参数在文档中有详细定义,这里我们只简单介绍一些最常用的:

更多字段:

更多参数:

3 settings配置

若想将模型转为mysql数据库中的表,需要在settings中配置:

复制代码
DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME':'bms',           # 要连接的数据库,连接前需要创建好'USER':'root',        # 连接数据库的用户名'PASSWORD':'',        # 连接数据库的密码'HOST':'127.0.0.1',       # 连接主机,默认本级'PORT':3306            #  端口 默认3306}
}
复制代码

注意1:NAME即数据库的名字,在mysql连接前该数据库必须已经创建,而上面的sqlite数据库下的db.sqlite3则是项目自动创建 USER和PASSWORD分别是数据库的用户名和密码。设置完后,再启动我们的Django项目前,我们需要激活我们的mysql。然后,启动项目,会报错:no module named MySQLdb 。这是因为django默认你导入的驱动是MySQLdb,可是MySQLdb 对于py3有很大问题,所以我们需要的驱动是PyMySQL 所以,我们只需要找到项目名文件下的__init__,在里面写入:

1
2
import pymysql
pymysql.install_as_MySQLdb()

最后通过两条数据库迁移命令即可在指定的数据库中创建表 :

1
2
python manage.py makemigrations
python manage.py migrate

注意2:确保配置文件中的INSTALLED_APPS中写入我们创建的app名称

复制代码
INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles',"book"
]
复制代码

注意3:如果报错如下:

1
django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.3 or newer is required; you have 0.7.11.None

MySQLclient目前只支持到python3.4,因此如果使用的更高版本的python,需要修改如下:

通过查找路径C:\Programs\Python\Python36-32\Lib\site-packages\Django-2.0-py3.6.egg\django\db\backends\mysql
这个路径里的文件把

1
2
if version < (133):
     raise ImproperlyConfigured("mysqlclient 1.3.3 or newer is required; you have %s" % Database.__version__)

注释掉 就OK了。

注意4: 如果想打印orm转换过程中的sql,需要在settings中进行如下配置:

添加表纪录

方式1

1
2
# create方法的返回值book_obj就是插入book表中的python葵花宝典这本书籍纪录对象
  book_obj=Book.objects.create(title="python葵花宝典",state=True,price=100,publish="苹果出版社",pub_date="2012-12-12")

方式2

1
2
book_obj=Book(title="python葵花宝典",state=True,price=100,publish="苹果出版社",pub_date="2012-12-12")
book_obj.save()

查询表纪录

查询API

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<1all():                  查询所有结果
 
<2filter(**kwargs):       它包含了与所给筛选条件相匹配的对象
 
<3> get(**kwargs):          返回与所给筛选条件相匹配的对象,返回结果有且只有一个,
                            如果符合筛选条件的对象超过一个或者没有都会抛出错误。
 
<4> exclude(**kwargs):      它包含了与所给筛选条件不匹配的对象
<5> order_by(*field):       对查询结果排序
 
<6> reverse():              对查询结果反向排序
 
<8> count():                返回数据库中匹配查询(QuerySet)的对象数量。
 
<9> first():                返回第一条记录
 
<10> last():                返回最后一条记录
 
<11> exists():              如果QuerySet包含数据,就返回True,否则返回False
<12> values(*field):        返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列
                            model的实例化对象,而是一个可迭代的字典序列
<13> values_list(*field):   它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
<14> distinct():            从返回结果中剔除重复纪录

基于双下划线的模糊查询

1
2
3
4
5
6
7
8
Book.objects.filter(price__in=[100,200,300])
Book.objects.filter(price__gt=100)
Book.objects.filter(price__lt=100)
Book.objects.filter(price__range=[100,200])
Book.objects.filter(title__contains="python")
Book.objects.filter(title__icontains="python")
Book.objects.filter(title__startswith="py")
Book.objects.filter(pub_date__year=2012)

删除表纪录

删除方法就是 delete()。它运行时立即删除对象而不返回任何值。例如:

1
model_obj.delete()

你也可以一次性删除多个对象。每个 QuerySet 都有一个 delete() 方法,它一次性删除 QuerySet 中所有的对象。

例如,下面的代码将删除 pub_date 是2005年的 Entry 对象:

1
Entry.objects.filter(pub_date__year=2005).delete()

在 Django 删除对象时,会模仿 SQL 约束 ON DELETE CASCADE 的行为,换句话说,删除一个对象时也会删除与它相关联的外键对象。例如:

1
2
3
= Blog.objects.get(pk=1)
# This will delete the Blog and all of its Entry objects.
b.delete()

要注意的是: delete() 方法是 QuerySet 上的方法,但并不适用于 Manager 本身。这是一种保护机制,是为了避免意外地调用 Entry.objects.delete() 方法导致 所有的 记录被误删除。如果你确认要删除所有的对象,那么你必须显式地调用:

1
Entry.objects.all().delete()  

如果不想级联删除,可以设置为:

1
pubHouse = models.ForeignKey(to='Publisher', on_delete=models.SET_NULL, blank=True, null=True)

修改表纪录

1
Book.objects.filter(title__startswith="py").update(price=120)

此外,update()方法对于任何结果集(QuerySet)均有效,这意味着你可以同时更新多条记录update()方法会返回一个整型数值,表示受影响的记录条数。

回到顶部

章节作业

1 图书管理系统

实现功能:book单表的增删改查

2 查询操作练习

1
2
3
4
5
6
7
8
9
1 查询老男孩出版社出版过的价格大于200的书籍
2 查询20178月出版的所有以py开头的书籍名称
3 查询价格为50,100或者150的所有书籍名称及其出版社名称
4 查询价格在100200之间的所有书籍名称及其价格
5 查询所有人民出版社出版的书籍的价格(从高到低排序,去重)

转载于:https://www.cnblogs.com/journey-mk5/p/9833160.html

相关文章:

软件测试面试的linux基础知识,linux基础面试题

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼linux的用户管理useradd 用户名&#xff0c;添加用户【案例】useradd xiaomingpasswd 用户名&#xff0c;为新用户设密码【案例】passwd xiaoming&#xff0c;修改小明的密码userdel 用户名&#xff0c;删除用户【案例】userdel xi…

s-sort命令

对文本操作进行排序&#xff0c;以行为单位&#xff0c;依次根据ascii值进行比较&#xff0c;默认的排序方式为升序 sort [-bcfMnrtk][源文件][-o 输出文件]补充说明&#xff1a;sort可针对文本文件的内容&#xff0c;以行为单位来排序。 参 数&#xff1a;-b 忽略…

变体类的使用 package record case【转载】

**************理论区 start********************* DELPHI中记录的存储方式 在DELPHI中&#xff0c;我们用record关键字来表明一个记录&#xff0c;有时候&#xff0c;我们还会看到用packed record来声明的记录&#xff0c;这二者的区别就在于存储方式的不同&#xff1b;在wind…

【Boost】系列01:时间与日期

timer库(含timer,progress_timer和progress_display三个组件)和date_time timer用法&#xff1a; #include <boost/timer.hpp> #include <iostream> using namespace std; using namespace boost;int main() {timer t;//开始计时cout<<"max timespan:&q…

git学习网址

1、git 上传代码到GitHub 以及git删除github上文件和文件的命令 - lexsaints - CSDN博客 https://blog.csdn.net/weixin_42350212/article/details/80560272 2、git误区error: failed to push some refs to gitgithub.com: - whaleluo的博客 - CSDN博客 https://blog.csdn.n…

Linux压缩和解压缩命令集

.tar文件 解压tar zxvf FileName.tar打包tar czvf SourceName.tar DirName .gz文件 解压&#xff1a; gunzip FileName.gzgzip -d FileName.gz 压缩 gzip FileName .tar.gz 和.gz文件 解压tar zxvf FileName.tar.gz压缩tar zcvf FileName.tar.gz DirName .bz2文件 解压…

XMPP通讯开发-好友获取界面设计

在XMPP通讯开发-服务器连接 中我们成功连接到服务器上面&#xff0c;然后进入到主界面&#xff0c;接下来就是获取好友列表&#xff0c;这里我们分段开发&#xff0c;首先就是界面的设计&#xff0c;这里仿照QQ好友界面&#xff0c;里面的数据先是用模拟的&#xff0c;下一章获…

linux test数字txt,Linux26期 7月4日预习笔记

9.4/9.5 sed一&#xff0c;打印某行sed命令的格式为&#xff1a;sed -n np filename ,单引号内的n是一个数字&#xff0c;可以使用命令sed -n 1,$p filename ,如下去掉-n是有差异要想把所有行打印出来&#xff0c;可以使用命令sed -n 1,$p filename#sed -n 1,$p 文件名另外&…

提高PHP运行速度的小技巧

使用PHP的最大1个优势就是速度快。一般情况下&#xff0c;PHP总是具有足够的速度支持Web内容动态生成&#xff0c;许多时候甚至无法找出比它更快的方法。然而&#xff0c;当面对庞大的访问量、高负荷的应用、有限的带宽&#xff0c;以及其他各种带来性能瓶颈的因素时&#xff0…

基于Python, Selenium, Phantomjs无头浏览器访问页面

引言&#xff1a; 在自动化测试以及爬虫领域&#xff0c;无头浏览器的应用场景非常广泛&#xff0c;本文将梳理其中的若干概念和思路&#xff0c;并基于代码示例其中的若干使用技巧。 1. 无头浏览器 通常大家在在打开网页的工具就是浏览器&#xff0c;通过界面上输入网址就可以…

groovy–流程控制

在本篇文章中&#xff0c;我们将介绍逻辑分支&#xff0c;循环&#xff0c;以及如何从if-else以及try-catch代码块中返回值。 if – elseGroovy 支持Java传统的if-else语法&#xff1a; def x false def y falseif ( !x ) {x true }assert x trueif ( x ) {x false } else…

c语言中二进制用什么字母表示方法,看C语言编码转换--------负数的二进制表示方法...

今天在看C语言编码转换时&#xff0c;既然对负数的二进制表示有些遗忘&#xff0c;查了下网上的资料&#xff0c;他们说的是个P&#xff01;误人子弟&#xff01;和大家讨论了下&#xff0c;贴出来已备在此遗忘&#xff1a;假设有一个 int类型的数&#xff0c;值为5&#xff0c…

du和df的区别

du,disk usage 是通过搜索文件来计算每个文件的大小然后累加&#xff0c;du能看到的文件只是一些当前存在 的&#xff0c;没有被删除的。他计算的大小就是当前他认为存在的所有文件大小的累加和df,disk free,通过文件系统来快速获取空间大小的信息&#xff0c;当我们删除一个文…

solaris11学习必用工具及ISO

一、软件准备、配置及相关说明1&#xff09;Oracle VM VirtualBox & Oracle VM VirtualBox Extension Pack  http://www.oracle.com/technetwork/server-storage/virtualbox/downloads/index.html#vbox说明&#xff1a;VirtualBox是Oracle自己的东西&#xff0c;很多考试…

谜题59:什么是差?

下面的程序在计算一个int数组中的元素两两之间的差&#xff0c;将这些差置于一个集合中&#xff0c;然后打印该集合的尺寸大小。那么&#xff0c;这个程序将打印出什么呢&#xff1f; import java.util.*;public class Differences {public static void main(String[ ] args) {…

ceph-osd无法获取osd map导致osd down掉的解决办法

环境&#xff1a;ceph-12.2.1 3节点测试性能集群 60块osd 最近ceph集群中有两个osd在重启之后遇到如下问题,osd获取不到集群osdmap产生coredump&#xff1a; ceph version 12.2.1.06 (3e7492b9ada8bdc9a5cd0feafd42fbca27f9c38e) luminous (stable)1: (()0xa2bf21) [0x7fcd9162…

读书笔记2013第13本:《怎样解题》

《怎样解题》这本书是在看《编程大师访谈录》&#xff08;中文版第12页&#xff09;这本书时无意发现的&#xff0c;一个编程大师推荐这本书来指导编程设计&#xff0c;google到这本书后粗略地翻看了一遍&#xff0c;发现是一本教学生如何解数学题的非常有年头的书。随着仔细品…

suse linux登录黑屏,SUSE Linux登录时黑屏解决办法

我采用的virtual pc虚拟机&#xff0c;安装redhat enterprise 4 linux&#xff0c;安装后出现花屏&#xff0c;通过GRUB的单用户模式下修改/etc/X11/xorg.con我采用的virtual pc虚拟机&#xff0c;安装RedHat enterprise 4 linux&#xff0c;安装后出现花屏&#xff0c;通过GRU…

应用构建工具包 Ecere SDK

Ecere SDK是一个跨平台的工具包构建软件应用程序。目前运行在Windows、Linux和Mac OS X(通过X11)。通过 Ecere SDK,可以开发一次应用程序,并将其部署在所有支持的平台上与一个轻量级运行时环境。它引入了eC这个面向对象语言来源于和完全兼容C,性能好也易于使用。一个内置的3d引…

第39-43课 thinkphp5完成商品会员价格功能(后置勾子afterInsert)

目录 功能一:利用后置勾子,处理好商品主键id,会员的价格,再插入member_price表里.要实现的功能:思路:html里控制器里模型里的后置勾子afterInsert()功能二:利用后置勾子,上传图片,批量生成缩略图,再插入goods_photo表里.要实现的功能:控制器里的用调用模型用save()方法保存模型…

codeforces A. Jeff and Digits 解题报告

题目链接&#xff1a;http://codeforces.com/problemset/problem/352/A 题目意思&#xff1a;给定一个只有0或5组成的序列&#xff0c;你要重新编排这个序列&#xff08;当然你可以不取尽这些数字&#xff09;&#xff0c;使得这个序列尽可能地大&#xff0c;并且能被90除尽。 …

内核方式挂载cephfs

我们内核挂载的前提是&#xff1a;看到centos7.5 中默认内核3.10.0-862.11.6.el7.x86_64的挂载fs执行文件读写性能更优良&#xff0c;所以尝试将3.10.0-862.11.6.el7.x86_64模块中与ceph fs挂载相关的ceph.ko,libceph.ko,dns_resolver.ko,libcrc32c.ko拷贝到自己的设备。 同样要…

汉诺塔怎么加计数次数c语言,C语言计算汉诺塔最小移动步数 (二)

前几天写的&#xff1a;C语言计算汉诺塔最小移动步数(一)当时还不知道用2^n-1这个公式来求解汉诺塔移动步骤。_偶然间在网上发现了这个公式&#xff0c;发现当时写的算法还是比较繁琐的。所以又根据这个公式又写了一个。那篇的实现是两个数组来回赋值&#xff0c;这个是用一个数…

Myeclipse 8.0 +Flash builder 4 plugin 的实现

其实过程非常&#xff0c;简单&#xff0c;但是我之前在网上找了很多资料都说&#xff0c;需要先装 Eclipse 3.5 &#xff0c;然后安装MyEclipse 8.0的插件到Eclipse&#xff0c;最后再安装Flash builder 的插件&#xff0c;期间还要进行一些文件的复制和转移等&#xff0c;弄得…

DHCP服务搭建

DHCP服务 一、DHCP概述 DHCP&#xff08;Dynamic Host Configuration Protocol&#xff0c;动态主机配置协议&#xff09;通常被应用在大型的局域网络环境中&#xff0c;主要作用是集中的管理、分配IP地址&#xff0c;使网络环境中的主机动态的获得IP地址、Gateway地址、DNS服务…

根据c语言数组定义填写下表,C语言程序设计 自测题(三)

{ n;if(n%3!0) continue;k--; }printf("%d,%d/n",k,n);}程序运行后的输出结果是______。A、1,1B、2,2C、3,3D、4,435、以下不能正确定义二维数组的选项是______。A、int a[2][2]{{1},{2}};B、int a[][2]{1,2,3,4};C、int a[2][2]{{1},2,3}D、int a[2][]{{1,2},{3,4}…

linux if 命令判断条件总结

linux if命令 关于文件属性的判断式 -a 如果文件存在 -b 如果文件存在&#xff0c;且该文件是区域设备文件 -c 当file存在并且是字符设备文件时返回真 -d 当pathname存在并且是一个目录时返回真 -e 当pathname指定的文件或目录存在时返回真 -f 当file存在并且是普通文件时返回真…

ppt文本框显示缺字,信息显示不全

1.在文字后面加个空格。2.重新调整文本框大小3.不需要打开ppt&#xff0c;而是在图标上右键属性-摘要&#xff0c;把标题、主题、作者等描述全部清空或改成与本机用户一至即可。因为文本框少子是信息不匹配&#xff0c;就像歌曲在mp3里播放出现的乱码一样。具体能否解决问题&am…

property装饰器

# 需要了解的property的用法 class People:def __init__(self,name):self.__namenamepropertydef name(self):return <name:%s> %self.__namename.setterdef name(self,new_name):if type(new_name) is not str:print(名字必须是str类型)returnself.__namenew_namename.d…

f-fdisk做磁盘分区,起始扇区从2048块开始

文章目录First Sector 起始扇区fdisk工具加分区fdisk删除分区First Sector 起始扇区 默认从第2048块扇区开始是因为,由于EFI的兴起&#xff0c;要给EFI 代码留磁盘最开始的1M空间&#xff0c;即2048*521/(1024*1024)1M With the death of the legacy BIOS (ok, its not quite …