select * from tb where id > 1 # 对应关系
models.tb.objects.filter(1id__gt=)
models.tb.objects.filter(id=1)
models.tb.objects.filter(id__lt=1)
创建类
a.先写类
from django.db import models
# 生成的表名 app01_userinfo
class UserInfo(models.Model):
# id列,自增,主键
# 用户名列,字符串类型,指定长度
username = models.CharField(max_length=32)
password = models.CharField(max_length=64)
b. 注册APP
settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
☆☆☆☆-> 'app01',
]
如果不想使用sqlite数据库,也可以到settings里配置成mysql数据库
DATABASES = {
'default:'{
'ENGINE':'django.db.backends.mysql',
'NAME':'dbname',
'USER':'root',
'PASSWORD':'xxxx',
'HOST':'',
'PORT':'',
}
}
c. 执行命令
python manage.py makemigrations
python manage.py migrate
d. ********** 注意 ***********
Django默认使用MySQLdb模块链接MySQL (python3,现在没有支持mysqldb)
主动修改为pymysql,在project同名文件夹下的__init__文件中添加如下代码即可:
import pymysql
pymysql.install_as_MySQLdb()
1. 根据类自动创建数据库表
如果创建或更改表结构时,一直失败,可以尝试删除makemigrations下的文件
# app下的models.py
python manage.py makemigrations
python manage.py migrate
字段:
字符串类型 CharField
数字 IntegerField,BigIntegerField
时间 DateTimeField
二进制 BinaryField
自增(primary_key=True) AutoField
Date Char Url 都是字符串,为什么要区分是因为要给Django admin管理使用
参数解析
字段的参数 |
作用 |
null |
db是否可以为空 |
default |
默认值 |
primary_key |
主键 |
db_column |
列名 |
db_index |
是否建立索引 |
unique |
唯一索引 |
on_delete |
级联操作:models.CASCADE级联删除,PROTECT抛出ProtectedError,models.SET_NULL置空模式,models.SET_DEFAULT置默认值,SET(): 自定义一个值 |
unique_for_date |
2006:11:11 11:11:11 只对时间索引 |
unique_for_month |
2006:(11):11 11:11:11 只对月份索引 |
unique_for_year |
2006:11:11 11:11:11 只对年份索引 |
auto_now |
创建时,自动生成时间 执行obj.save()时才更新 |
auto_now_add |
更新时,自动更新为当前时间 |
choices |
django admin中显示下拉框,避免连表查询 |
blank |
django admin是否可以为空 |
verbose_name |
django admin显示字段中文(verbose_name替换为其值显示) |
editable |
django admin是否可以被编辑 |
error_messages |
错误信息 |
help_text |
django admin输入框下面的小提示 |
validators |
django form ,自定义错误信息 |
# obj = UserGroup.objects.filter(id=1).update(caption='CEO')←←
# obj = UserGroup.objects.filter(id=1).first()
# obj.caption = "CEO"
# obj.save()
创建 Django 用户:python manage.py createsuperuser
增删查改时,可以使用同一个HTML,在处理时分发不用的views函数 -------> 详细例子day19,views函数模块
增
1.models.User.objects.create(name='aaa',age=18)
2.dic = {'name': 'xx', 'age': 19}
models.User.objects.create(**dic)
3.obj = models.User(name='aaa',age=18)
obj.save()
删
models.User.objects.filter(id=1).delete()
改
models.User.objects.filter(id__gt=1).update(name='aaa',age=22)
dic = {'name': 'xx', 'age': 19}
models.User.objects.filter(id__gt=1).update(**dic)
查
models.User.objects.filter(id=1,name='root')
models.User.objects.filter(id__gt=1,name='root') 相当于 and 多条件
models.User.objects.filter(id__lt=1)
models.User.objects.filter(id__gte=1)
models.User.objects.filter(id__lte=1)
models.User.objects.filter(id=1,name='root')
dic = {'name': 'xx', 'age__gt': 19}
models.User.objects.filter(**dic)
v1 = models.Business.objects.all() # QuerySet ,内部元素都是对象 v1.xxx
v2 = models.Business.objects.all().values('id','caption') # QuerySet ,内部元素都是字典 v2.xxx
v3 = models.Business.objects.all().values_list('id','caption') # QuerySet ,内部元素都是元组 v3.1 v3.2
# 获取到的一个对象,如果不存在就报错
models.Business.objects.get(id=1)
结果是对象或者None = models.Business.objects.filter(id=1).first()
models.tb.object.create(name='root', user_group_id=1)
d.
userlist = models.tb.object.all()
for row in userlist:
row.id
row.user_group_id
row.user_group.caption
默认取出来的是QuerySet列表,可以使用一下方法直接获取QuerySet对象
model.UserInfo.objects.filter(name='xxx').first() 如果单条数据不存在时,会直接报错,所以要加try expect
获取QuerySet对象个数
model.UserInfo.objects.filter(name='xxx').count()
连表操作会造成性能损失(效率非常低),对于固定的几个类型的外键关联时,可以使用choices将类型放至内存中
user_type_choices = {
(1,'超级用户'),
(2,'普通用户'),
(3,'其他用户'),
}
user_type_id = models.IntegerField(choices=user_type_choices,default=1) -------> Django admin 中能直接看到对应值
获取数据库表时,连同关联表一并取出。这样,在使用外键时(list.外键字段.外键关键字,就不用再次查询数据库,减少数据库操作)
- list = models.UserInfo.objects.all().select_related('user_type')
-
外键:
class UserType(models.Model):
caption = models.CharField(max_length=32)
id caption
# 1,普通用户
# 2,VIP用户
# 3, 游客
class User(models.Model):
age = models.IntergerFiled()
name = models.CharField(max_length=10)#字符长度
# user_type_id = models.IntergerFiled() # 约束,
user_type = models.ForeignKey("UserType",to_field='id') # 约束, ----------> 默认 user_type_id
使用外键的字段
models.User.objects.filter(id=1).first().caption
获取到QuerySet对象是 : QuerySet[obj(id,username,email,user_group_id,user_group_id(uid,caption))]
所以print user_group_id 是一个UserGroup对象
name age user_type_id
# user1 18 3
# user2 18 2
# user3 18 2
外键巧用
1.
models.User.objects.create(
username="...",
password='...',
...,
user_group = models.UserGroup.objects.filter(id=1).first()
)
---------------->>>>>>>>>
models.User.objects.create(
...,
user_group_id = 1
)
2.在查表的时候,如果对象中有外键,那么外键就会当成对象被封装在QeurySet对象中,那么可以使用
obj.forginkey_obj
如果外键对象中还有外键,那么可以使用多次点,跨表查询
obj.forginkey_obj.forginkey_obj.forginkey_obj.forginkey_obj......
3.在查询时,只查询特定的某些项,可以用"_"获取关联的表字段
models.User.objects.all().values('nid','hostname','b_id','b__caption')
caption为外键关联表中的字段
首先这条语句获取的还是QuerySet的对象,对象中是列表,列表中的每一项才是字典
HTML 渲染时 这中语句获取的对象只能这样取值 obj.b__caption ,注意不要和前面的使用点混淆
models.User.objects.all().values_list('nid','hostname','b_id','b__caption')
这种取值和前面一样 obj.1 obj.3 obj.4
- Django学习之ORM操作
一.一般操作 二.必知必会13条 返回QuerySet对象的方法有 特殊的QuerySet 返回具体对象的 返回布尔值的方法有 返回数字的方法 三.单表查询之神奇的双下划线 四.ForeignKey操 ...
- Django 学习 之ORM聚合查询分组查询与F查询与Q查询
一.聚合查询和分组查询 1.聚合查询aggregate 关于数据表的数据请见上一篇:Django 学习 之ORM多表操作(点我) aggregate(*args, **kwargs),只对一个组进行聚 ...
- Python/Django(CBV/FBV/ORM操作)
Python/Django(CBV/FBV/ORM操作) CBV:url对应的类(模式) ##====================================CBV操作============ ...
- Django - 表与ORM操作
Django - 表与ORM操作 一. 模板语言 模板中也有自己的语言, 该语言可以实现数据展示 - {{ 变量 }} - 循环 {% for i in all_publisher %} {{ for ...
- Django学习手册 - ORM 数据创建/表操作 汇总
ORM 查询的数据类型: QuerySet与惰性机制(可以看作是一个列表) 所谓惰性机制:表名.objects.all()或者.filter()等都只是返回了一个QuerySet(查询结果集对象),它 ...
- 初学Django基础02 ORM操作
django的ORM操作 之前我们知道了models.py这个文件,这个文件是用来读取数据结构的文件,每次操作数据时都走这个模块 常用字段 AutoField int自增列,必须填入参数 primar ...
- Django 模型层 ORM 操作
运行环境 1. Django:2.1.3 version 2. PyMysql: 0.9.3 version 3. pip :19.0.3 version 4. python : 3.7 versio ...
- Django专题之ORM操作2
Django ORM操作 目录 一般操作 看专业的官网文档,做专业的程序员! 回到顶部 必知必会13条 <1> all(): 查询所有结果 <2> get(**kwargs ...
- Django 学习 之ORM多表操作
一.创建模型 1.模型关系整理 创建一对一的关系:OneToOne("要绑定关系的表名") 创建一对多的关系:ForeignKey("要绑定关系的表名") 创建 ...
- Django 学习 之ORM简介与单表操作
一.ORM简介 1.ORM概念 对象关系映射(Object Relational Mapping,简称ORM). 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到 ...
随机推荐
- JAX-RS和Jersey
一:JAX-RS JAX-RS是JAVA EE6 引入的一个新技术. JAX-RS即Java API for RESTful Web Services,是一个Java 编程语言的应用程序接口,支持按照 ...
- 好用的开源库(二)——uCrop 图片裁剪
最近想要实现图片裁剪的功能,在Github上找到了这个uCrop,star的人挺多的,便是决定入坑,结果长达一个小时的看资料+摸索,终于是在项目中实现了图片裁剪的功能,今天便是来介绍一下uCrop的使 ...
- 《Thinking in Java》学习笔记(三)
1>Java中的常量 使用final和static来修饰的变量称为常量,常量用大写字母表示,字母间用下划线连接. Java中定义常量有以下几种方式: interface ConstantInte ...
- 常系数齐次线性递推 & 拉格朗日插值
常系数齐次线性递推 具体记在笔记本上了,以后可能补照片,这里稍微写一下,主要贴代码. 概述 形式: \[ h_n = a_1 h_{n-1}+a_2h_{n-2}+...+a_kh_{n-k} \] ...
- E 洛谷 P3598 Koishi Loves Number Theory[数论]
题目描述 Koishi十分喜欢数论. 她的朋友Flandre为了检测她和数论是不是真爱,给了她一个问题. 已知 给定和个数,求对取模. 按照套路,呆萌的Koishi当然假装不会做了,于是她来向你请教这 ...
- angularjs 指令详解
一.指令定义 对于指令,可以把它简单的理解成在特定DOM元素上运行的函数,指令可以扩展这个元素的功能. 首先来看个完整的参数示例再来详细的介绍各个参数的作用及用法: <div my-direct ...
- 洛谷P1171 售货员的难题【状压DP】
题目描述 某乡有n个村庄(1 输入格式: 村庄数n和各村之间的路程(均是整数). 输出格式: 最短的路程. 输入样例: 3 0 2 1 1 0 2 2 1 0 输出样例 3 说明 输入解释 3 {村庄 ...
- 基于jquery的城市选择插件
城市选择插件的难度不是很大,主要是对dom节点的操作.而我写的这个插件相对功能比较简答,没有加入省市联动. 上代码好了,参照代码的注释应该比较好理解. /* *基于jquery的城市选择插件 *aut ...
- Yii2中把路由地址中的%2F改为/
第一步:找到/vendor/yiisoft/yii2/web/UrlManager.php 第二步:搜索$url = "$baseUrl?{$this->routeParam}=&qu ...
- ansible基本使用教程
转载请注明出处http://www.cnblogs.com/chenxianpao/p/7360349.html 一. 介绍 1. 简介 ansible是新出现的自动化运维工具,基于Pytho ...