Django:模型model和数据库mysql(二)
上一篇把简单的模型与数据库的搭建写了一遍,但模型中有很多深入好用的写法补充一下。
同样的栗子,建立新的模型与数据库来写一写
1、依然是搭建环境
>>>django-admin startproject django2
>>>cd django2
配置数据库、语言、地区
django2/settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'django2',
'USER': 'root',
'PASSWORD': '',
'HOST': 'localhost',
'PORT': ''
}
}
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
# 创建应用
>>>python manage.py startapp booktest
把该应用添加到settings中
django2/settings.py
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'booktest'
)
2、定义模型
booktest/models.py
class BookInfo(models.Model):
btitle = models.CharField(max_length = 20)
bpub_date = models.DateTimeField(db_column = 'pub_date') # db_column指定在数据库中呈现的字段名称
bread = models.IntegerField(default = 0) # default指定默认值
bcomment = models.IntegerField(null = False) # null指示该字段是否为空 True可以为空 False不能为空
isDelete = models.BooleanField(default = False)
class Meta:
db_table = 'bookinfo' # 指定数据库中生成的表明(默认是 应用名_模型类名 booktest_bookinfo)
def __str__(self):
return self.btitleclass HeroInfo(models.Model):
hname = models.CharField(max_length = 10)
hgender = models.BooleanField(default = True) # True:男 False:女
hcontent = models.CharField(max_length = 1000)
isDelete = models.BooleanField(default = False)
book = models.ForeignKey(BookInfo, on_delete = models.CASCADE)
def __str__(self):
return self.hname
创建数据库Django2后
# 制作迁移
>>>python manage.py makemigrations
# 生成迁移
>>>python manage.py migrate
自定义管理器场景一:修改默认查询集
booktest/models.py
class BookInfo(models.Model):
btitle = models.CharField(max_length = 20)
bpub_date = models.DateTimeField(db_column = 'pub_date') # db_column指定在数据库中呈现的字段名称
bread = models.IntegerField(default = 0) # default指定默认值
bcomment = models.IntegerField(null = False) # null指示该字段是否为空 True可以为空 False不能为空
isDelete = models.BooleanField(default = False)
class Meta:
db_table = 'bookinfo' # 指定数据库中生成的表明(默认是 应用名_模型类名 booktest_bookinfo)
def __str__(self):
return self.btitle
book1 = models.Manager() # 指定book1为模型类的管理器对象
book2 = BookInfoManager() # 用来下面写筛选 class HeroInfo(models.Model):
hname = models.CharField(max_length = 10)
hgender = models.BooleanField(default = True) # True:男 False:女
hcontent = models.CharField(max_length = 1000)
isDelete = models.BooleanField(default = False)
book = models.ForeignKey(BookInfo, on_delete = models.CASCADE)
def __str__(self):
return self.hname
在manage.py shell中,通过命令
>>>from booktest.models import BookInfo, HeroInfo
# 导入模块
>>> BookInfo.book1.all()
# 查看所有的书的信息
# 注意:这样写了以后,默认的管理器objects就不存在了
自定义管理器的场景二:添加创建的方法。
# 之前的写法
b = BookInfo()
b.btitle = '射雕英雄传'
b.bpub_date = datetime(year = 2018, month = 8, day = 11)
b.save()
现在提供一个create()方法,只需要传入参数,即可创建对象
这个create()方法可以写在BookInfo中,也可以写在BookInfoManager中。官方推荐写在BookInfoManager中。
class BookInfoManager(models.Manager):
def get_queryset(self):
return super(BookInfoManager,self).get_queryset().filter(isDelete = False)
def create(self, btitle, bpub_date):
b = BookInfo()
b.btitle = btitle
b.bpub_date = bpub_date
b.bread = 0
b.bcomment = 0
b.isDelete = False
return b
# 注意python manage.py shell需要退出并重新进入。
# 测试代码:
from booktest.models import *
from datetime import datetime
b = BookInfo.book2.create('程序员的自我修炼',datetime(2018,9,12))
b.save()
运行后,留意数据库的bookinfo表多了程序员的自我修炼一行
3、模型查询
'''
返回查询集合的方法,称为过滤器
all():获取所有的数据
filter():获取满足条件的数据
exclude():获取不满足条件的是数据
'''
# 注意:如果使用and与操作同时过滤两个条件,可以使用如下两种方法之一
>>>BookInfo.book1.filter(bread__gt=22, bcomment__lt=50)
>>>BookInfo.book1.filter(bread__gt=22).filter(bcomment__lt=50) # order_by():排序
>>>BookInfo.book1.all().order_by("bread") # values():把一个对象构建成一个字典。最后返回一个列表
>>>BookInfo.book1.values() '''
返回单个值的方法:
get():返回单个满足条件的对象
如果返回多个数,会抛出MultipleObjectsReturned异常
如果未找到,会抛出DoesNotExist异常
'''
>>>BookInfo.book1.get(btitle='雪山飞狐') #count():返回当前查询的总条数(返回一个整数)
>>>BookInfo.book1.all().count() # first():返回第一个对象
# last():返回最后一个对象
>>>BookInfo.book1.all().first()
>>>BookInfo.book1.all().last() # exists():判断查询集中是否有数据,如果有返回True
>>>BookInfo.book1.filter(bread__gt=20).exists() '''
方法filter()、exclude()、get()……可以添加子查询运算符
比较运算符。格式为:
属性名_ _比较运算符 = 值
''' # exact:表示判断相等。如果没有写比较运算符,默认则是exact。
# 所以下面两句是等效的
>>>BookInfo.book1.filter(bread__exact=20)
>>>BookInfo.book1.filter(bread=20) # contains:是否包含
>>>BookInfo.book1.filter(btitle__contains='传') #startswith:以某个子串开头
# endswith:以某个子串结尾
>>>BookInfo.book1.filter(btitle__startswith='传')
>>>BookInfo.book1.filter(btitle__endswith='传') # isnull:为空
#i snotnull:不为空
>>>BookInfo.book1.filter(btitle__isnull=False) # 注意:前面的操作都是区分大小写的。如果不区分大小写,可以在前面加上i。比如iexact、icontains、istartswith、iendswith等 # in:是否包含在范围内
>>>BookInfo.book1.filter(pk__in=[1,2,3])
>>>BookInfo.book1.filter(id__in=[1,2,3]) '''
gt:大于(Greater Than)
gte:大于等于(Greater Than or Equal)
lt:小于(Little Than)
lte:小于等于(Little Than or Equal)
'''
>>>BookInfo.book1.filter(bread__gte=20)
# 注意:这些操作也可以对日期进行判断。包括year month day week_day hour minute second
>>>from datetime import date
>>>BookInfo.book1.filter(bpub_date__gt=date(1985,12,31)) # 跨表查询
# 语法:模型类名_ _属性名_ _比较
>>>BookInfo.book1.filter(heroinfo__hcontent__contains='八')
Django:模型model和数据库mysql(二)的更多相关文章
- Django:模型model和数据库mysql(一)
以一个栗子尝试来记录: 两个表存储在数据库中,BookInfo表示书,HeroInfo表示人物.一本书中有多个人物 在MySQL中新建一个数据库Django1,不用创建表,用Django模型来配置数据 ...
- Scrapy中使用Django的Model访问数据库
Scrapy中使用Django的Model进行数据库访问 当已存在Django项目的时候,直接引入Django的Model来使用比较简单 # 使用以下语句添加Django项目的目录到path impo ...
- Django进阶Model篇001 - mysql 数据库的配置
django 默认支持sqlite.mysql.oracle.postgresql数据库,像db2和sqlserver之类的数据库需要第三方的支持,具体详见: https://docs.djangop ...
- Django进阶Model篇—数据库操作(ORM)
一.数据库配置 django 默认支持sqlite.mysql.oracle.postgresql数据库,像db2和sqlserver之类的数据库需要第三方的支持,具体详见https://docs.d ...
- django使用model创建数据库表使用的字段
Django通过model层不可以创建数据库,但可以创建数据库表,以下是创建表的字段以及表字段的参数.一.字段1.models.AutoField 自增列= int(11) 如果没有的话,默认会生成一 ...
- Django模型Model的定义
概述 Django对各种数据库提供了很好的支持,Django为这些数据库提供了统一的调用API,可以根据不同的业务需求选择不同的数据库. 模型.属性.表.字段间的关系 一个模型类在数据库中对应一张表, ...
- django -- 为model 指定数据库名
一.为model指定数据库名: django自己实现的ORM中.如果要指定一个model的表名是通过Meta类来实现的. from django.db import models # Create y ...
- Django(十)模型:django模型类对数据库的:增/删/改/查、自关联、管理器、元选项(指定表名)
一.插入.更新和删除 调用一个模型类对象的save方法的时候就可以实现对模型类对应数据表的插入和更新. 调用一个模型类对象的delete方法的时候就可以实现对模型类对应数据表数据的删除. 二.自关联 ...
- Django框架model实现数据库增删查改
1.创建Django工程 https://www.cnblogs.com/CK85/p/10159159.html 2.在model.py中配置生成表格的类对象. from django.db imp ...
随机推荐
- pureftpd.passwd解析
将pureftpd.passwd文件的内容转换成sql语句,导入到mysql pureftp.passwd格式: <account>:<password>:<uid> ...
- IT? 挨踢
中国的IT,是最憋屈的IT. 他们掌握着正常人看不懂的英文+字母+标点符号组成的各类代码语言 他们像作者一样从无到有,从空白的白纸上敲出上千上万条华丽的计算机语言 但是他们承受着正常人的鄙视: 我的需 ...
- [svc]rsync简单部署
安装rsync服务端-backup服务器 yum install rsync -y useradd rsync -s /sbin/nologin -M chown -R rsync.rsync /da ...
- elasticsearch中 refresh 和flush区别【转】
elasticsearch中有两个比较重要的操作:refresh 和 flush refresh操作 当我们向ES发送请求的时候,我们发现es貌似可以在我们发请求的同时进行搜索.而这个实时建索引并可以 ...
- 阿里巴巴CI:CD之分层自动化实践之路
阿里巴巴CI:CD之分层自动化实践之路 2018-05-30 摘自:阿里巴巴CI:CD之分层自动化实践之路 目录 1 自动化 1.1 为什么要做自动化? 1.2 自动化的烦恼 1.3 自动化的追 ...
- 【emWin】例程二十三:窗口对象——Graph
简介: 图形小工具可用于可视化数据.图形小工具的典型应用是显示测量值或函数图形的曲线,可同时显 示多条曲线.可使用水平和垂直刻度来标记曲线.可在背景上显示具有不同水平和垂直间距的网格.如 果数据阵列不 ...
- SmileyCount.java笑脸加法程序代写(QQ:928900200)
SmileyCount.java 1/4Java Programming 2014Course Code: EBU4201Mini ProjectTask 1 [30 marks]SmileyCoun ...
- (原)使用TortoiseGit提交代码push的时候报错:HTTP 413 curl 22 The requested URL returned error: 413 Request Entity Too Large
今天我想rk的sdk包里面的一些东西提交到我的git服务器上,结果,总是报错,折腾了一下午,结果才解决. 首先看看我提交代码的时候,报错的信息: git.exe push --progress &qu ...
- GDC2017 把“现实的天空”在游戏内再现【Forza Horizon 3】的天空表现
原文链接 http://game.watch.impress.co.jp/docs/news/1047800.html 完全表现出现实世界中各种偶然而不可预料的风景! [Forza Horiz ...
- 负载均衡集群介绍 LVS介绍 LVS调度算法 LVS NAT模式搭建
LVS BAT模式搭建 更改主机名: hostnamectl set-hostname centos7-three bash 准备工作 • 三台机器 • 分发器,也叫调度器(简写为dir) • 内网: ...