009---Django的模型层(1)
2024-09-04 14:57:21
ORM
全称:对象--关系--映射
数据表----类
数据行----对象
字 段----属性
优势:专注于后端逻辑,不用写复杂的sql语句
劣势:会忘掉sql,牺牲了效率
Django连接mysql数据库:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'orm1', # 连接的数据库,需要自己提前创建好
'USER':'root', # 连接数据库的用户名
'PASSWORD':'root', # 连接数据库的密码
'HOST':'127.0.0.1', # 连接主机,默认本机
'PORT':3306, # 端口,默认3306
}
}
settings.py
项目目录下的__init__.py
import pymysql
pymysql.install_as__MYSQLdb()
创建模型:app下的models.py
# Create your models here.
class Book(models.Model):
id = models.AutoField(primary_key=True)
title = models.CharField(max_length=32)
pub_date = models.DateField()
price = models.DecimalField(max_digits=8,decimal_places=2)
publish = models.CharField(max_length=32) def __str__(self):
return self.title
常用字段:
常用字段类型
# 主键、自增 id = models.AutoField(primary_key=True)
# varchar name = models.CharField(max_length=16) 后面一定要有长度 代表varchar(16)
# 整数 age = models.IntegerField()
# 浮点数 price = models.DecimalField(max_digits=8,decimal_places=2) 最大长度八位,小数点后面两位
# 日期时间 birth = models.DateTimeField(auto_now_add=True) 对象创建时自动添加当前时间 就好比人出生就有一个生日一样
# 日期 pub_date = models.DateField(auto_now=True) 对象每次修改时修改为当前时间 两个互斥 不可共存
# 大文本类型 content = model.TextField()
自定义字段:
class MyCharField(models.Field):
"""
继承model.Field
自定义的char类型字段
"""
def __init__(self,max_length,*args,**kwargs):
# super(MyCharField, self).__init__(max_length=max_length,*args,**kwargs)
super().__init__(max_length,*args,**kwargs)
# models.Field.__init__(self,max_length=max_length,*args,**kwargs)
self.max_length = max_length def db_type(self, connection):
"""
限定生产数据库表的字段类型为char,长度为max_length指定的值
:param connection:
:return:
"""
return 'char(%s)'%self.max_length
字段参数:
字段参数
null = True 和数据库直接关联
blank = True 和表单提交验证关联 一般同时写上
db_column 列名 数据库显示的列名 但是orm还是自己的列名
default 默认值
unique 唯一索引
verbose_name admin显示中文
choices sex = models.CharField(max_length=2,choices=(('','男'),('','女'),('','未知'))) 数据库存的是前面的,要显示后面的用obj.get_sex_display()
模版取值{{ user|func:'sex'}} func是自己写的过滤器
Meta配置:
class Meta:
# 数据库生成的表名
db_table='table_name'
verbose_name='admin站点表名显示的名称'
verbose_name_plural='对象是复数时显示的名称' #联合唯一索引
unique_together=[
('field1','field2')
]
生成迁移文件:
python manage.py makemigrations
执行迁移:
python manage.py migrate
必知必会13条查询方式:
为了方便查询,添加django环境。直接运行py文件
import os if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ORM1.settings")
import django
django.setup() from app01.models import Book # 对象列表
# ret = Book.objects.all()
# print(ret) # get 不存在就报错 获取多个就报错
# ret = Book.objects.get(pk=3)
# print(ret) # Java ret.price # filter 返回queryset集合 不存在返回空,
# ret= Book.objects.filter(pk=3)
# print(ret) # <QuerySet [<Book: Java>]> ret[0].price # exclude 排除 不包含
# ret = Book.objects.exclude(id=3)
# print(ret) # 返回queryset集合 获取指定参数,默认获取所有 相当于select * form Book 的 * 字典类型
# ret = Book.objects.all().values()
# # ret = Book.objects.all().values('title','price')
# # print(ret) # 返回queryset集合 和values一样,但是是元祖形式
# ret = Book.objects.all().values_list('title','price')
# print(ret) # order_by 排序可以按照多个字段
# ret = Book.objects.order_by('-pk','price')
# print(ret) # reverse 反转 对排序后的结果再反转
# ret = Book.objects.order_by('-pk', 'price').reverse()
# print(ret) # distinct 去重 针对的是对字段去重 对all使用无任何意义
# ret = Book.objects.all().values('title').distinct()
# print(ret) # count 计数
# ret = Book.objects.all().count()
# print(ret) # exists 判断数据是否存在
# ret = Book.objects.filter(pk=3).exists()
# print(ret) # -----------------------------------模糊查询-----------------------------------
print(Book.objects.filter(price__gt=70).values('title','price')) # 大于 等于在后面加e
print(Book.objects.filter(price__lt=70).values('title','price')) # 小于 等于在后面加e
print(Book.objects.filter(title__startswith='P')) # <QuerySet [<Book: Python>]>
print(Book.objects.filter(title__icontains='p')) # <QuerySet [<Book: Python>, <Book: php>]>
print(Book.objects.filter(price__in=[66,99]))
print(Book.objects.filter(price__range=[60,90]))
总结:
总结:
返回queryset集合
all()
filter()
exclude()
order_by
reverse()
values() {}
values_list() ()
distinct()
返回对象
get()
first()
last() 返回布尔值
exists() 返回数字
count()
查询之后才能进行更新或删除操作
删除:
ret = Book.objects.filter(title='Linux').delete()
Book.objects.filter(publish='人民出版社').first().delete()
print(ret) # 元祖 返回个数和记录
更新:
# update 更新 调用者 queryset
Book.objects.filter(id=1).update(price=99.99)
最新文章
- 关于Ciarlet的泛函的一道homework的一个想法
- 关于VS打包程序无法弹出主界面的问题
- [BTS] RFC IDOC_INBOUND_ASYNCHRONOUS
- show processlist 其中status详解(适用于所有概况)
- [apache]用shell分析网站的访问情况
- 在Android项目中使用AndroidAnnotations(配置框架,显示Hello World!)
- 前端制作中,IE6还有必要兼容吗?
- POJ 1226 Substrings(后缀数组+二分答案)
- 【Java 之 JVM】Java内存结构概述
- Push to origin/master was rejected (Git提交错误)
- 西北地区打不开github的解决办法~
- VS开发入门二: VS 里提示图标的含义
- 利用Python中的for循环和while循环,打印各种方向的九九乘法表。
- converting the moment tensor to strie-dip-rake
- HTML中head与body标签
- 20155205 2016-2017-2 《Java程序设计》第2周学习总结
- hadoop mongodb install(3)
- MONGODB用户、角色和权限管理
- 【Java并发编程】:死锁
- 【bzoj4084】【sdoi2015】双旋转字符串
热门文章
- css取消a标签在移动端点击时的背景颜色
- Android基础Activity篇——Toast
- 升级jdk注意事项
- java,eclipse中如何添加httpclient.jar
- tomcat8.5配置优化
- 【CSS古话今说】-- 01.神奇的CSS-BFC在实战中的应用
- CRM WebUI and Hybris的Product页面标题实现
- ABAP Netweaver和Hybris Enterprise Commerce Platform的登录认证
- sap.ui.require in SAP UI5 and require in nodejs
- 解析xml文件,修改Jenkins的配置