交互式编程
交互式:
python manage.py shell
导入user中的模型类
from user.models import *
退出:
exit
增加数据
save方法:调用save方法后,user对象封装写入数据库中的数据内容
user = User()
user.username = ‘name1’
user.iduser.save()
user.id
1
修改user用户的密码为pass1:如果模型类中id没有值,为新增数据,有则为修改数据user.password=‘pass1’
user.save()
删除user对应数据库中的数据: 原理是根据id来删除user.delete()
增加:
user= User.objects.create(
username=‘name2’,
)
相当于:user = User(username=‘name2’)
user.save()
修改:
User.objects.filter(【条件】).update(属性=属性值)
例如:User.objects.filter(id=2).update(password=‘pass2’)
删除:
User.objects.filter(id=2).delete()
例子
创建数据库:
from django.db import models
import datetime
# Create your models here.
class User(models.Model):
username = models.CharField(max_length=16,unique=True)
password = models.CharField(max_length=16,default='123456')
gender=models.PositiveSmallIntegerField(default=0)
new = models.CharField(max_length=10,null=True)
age = models.IntegerField(null=True)
createDatetime=models.DateTimeField(auto_now_add=datetime.datetime.now())
在终端写入:python manage.py shell 进入交互式环境
导入所有: In [1]: from user.models import *
实例化一个: In [2]: user = User()
In [3]: user.username=‘name1’
In [4]: user.id # 返回为空!
In [5]: user.save() # 保存后表单出现数据!
In [6]: user.id # 打印id,返回数值!
Out[6]: 1
In [7]: user.password=‘pass1’ # 修改密码,保存后才会修改功
In [8]: user.save()
In [9]: user.delete() # 删除数据!
Out[9]: (1, {‘user.User’: 1})
In [11]: user =User.objects.create(username=‘name2’) # 新增数据
In [12]: user.id # 查看id
Out[12]: 2
In [13]: User.objects.filter(id=2).update(password=‘pass2’)# 修改
Out[13]: 1
In [14]: User.objects.filter(id=2).delete() #删除
Out[14]: (1, {‘user.User’: 1})
模型类的查询
查询语法格式
【模型类名字】.objects.【方法】(【条件】】)
例如:user =User.objects.get(id=1)
方法:
all(): 返回所有 get(条件):返回满足条件的数据
filter(条件):返回满足条件的数据 exclude(条件):返回不满足条件的数据
注意;
get方法必须满足返回一个对象;如没有或者有多个,都会报异常!
all,filter、exclude返回的结果类型都是QuerySet(类似列表)
例子
创建一个新的django项目,在settings配置:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'HOST':'localhost',
'POST':'3306',
'NAME': 'django_model',
'USER':'root',
'PASSWORD':'12345',
}
}
然后在model.py中:
from django.db import models
import datetime
# Create your models here.
from django.db import models
import datetime
# 用户模型类
class User(models.Model):
account = models.CharField(max_length=16, unique=True) # 登录账号
username = models.CharField(max_length=16, null=True, db_index=True) # 用户昵称
password = models.CharField(max_length=32) # 密码
gender = models.IntegerField(default=0) # 性别,0:男,1:女
birthday = models.DateField(null=True) # 生日
money = models.DecimalField(max_digits=10, decimal_places=2, default=0) # 余额,总位数10,小数位2,默认0
email = models.EmailField(null=True) # 邮箱
image = models.ImageField(null=True) # 头像
createDatetime = models.DateTimeField(auto_now_add=datetime.datetime.now()) # 创建时间
updateDatetime = models.DateTimeField(auto_now=datetime.datetime.now()) # 最近一次修改时间
isdelete = models.BooleanField(default=False) # 逻辑删除
# 创建user表数据
def build_user(num=100):
for i in range(num):
User.objects.create(
account='%05d' % i,
username='name%s' % i,
password=str(i),
gender=i % 2,
birthday=datetime.datetime.now() + datetime.timedelta(days=i),
money=i ** 2 + 12.34 * i + 100,
email='%05d@qq.com' % i,
createDatetime=datetime.datetime.now(),
updateDatetime=datetime.datetime.now(),
isdelete=i % 2,
)
链接MySQL:
创建数据库:
create database django_model;
生成迁移文件:python manage.py makemigrations
python manage.py migrate
刷新数据库!!!
启动项目:除了常规操作 还可以重新复制一份manage.py文件,在后面加上:
if __name__ == '__main__':
main()
from user.models import *
# 创建数据
build_user()
在这个新的py文件下启动,刷新数据库;就得到了数据:
get方法
重新复制一份manage.py文件,在后面加上:
print('-'*30)
from user.models import *
user1 = User.objects.get(id=1)
print(user1)
try:
User.objects.get(id=10000) # 没有id=10000的对象
except:
print('没有满足条件的对象,抛出异常')
# try:
User.objects.get(isdelete=0) # 多个对象满足条件
# except:
# print('多个对象满足条件,抛出异常')
检查异常错误,当有数据的时候,返回User object (1),当有多个或没有,则报异常!
all方法
方法如上:
if __name__ == '__main__':
main()
print('-'*30)
from user.models import *
user_s = User.objects.all()
print('user_s的类型是:', type(user_s))
for user in user_s:
print(user)
返回的是:
filter:
方法一样,返回的是QuerySet类型,取索引0实例化,打印出第一个:
if __name__ == '__main__':
main()
print('-'*30)
from user.models import *
user_s = User.objects.filter(id=1)
print('user_s的类型是:', type(user_s))
print(user_s)
user = user_s[0]
print(user)
返回:
exclude:
返回的是不成立的对象:
if __name__ == '__main__':
main()
print('-'*30)
from user.models import *
# 查询id不为1的user对象
user_s = User.objects.exclude(id=1)
print(user_s)
比较查询
相等:exact 大于:gt 小于:lt
大于等于:gte 小于等于: lte
为空查询:isnull
条件格式:
【字段名】__【条件关键字】=【比较值】
例子:查询id>=2的所有用户
users=User.objects.filter(id_get=2)
方法如上:
if __name__ == '__main__':
main()
print('-'*30)
from user.models import *
# 没有被逻辑删除的User
user1_s = User.objects.filter(isdelete=0)
print(user1_s)
user2_s = User.objects.filter(isdelete__exact=0)
print(user2_s)
# 查询余额大于等于1000的User对象
user3_s = User.objects.filter(money__gte=1000)
print(user3_s)
# 查询生日为空的User对象
user4_s = User.objects.filter(birthday__isnull=True)
print(user4_s)
显示的结果:
模糊查询
包含 :contains 开头: startswith 结尾: endswith
代码:
if __name__ == '__main__':
main()
print('-'*30)
from user.models import *
# 查询用户名中包含'1'的用户
user1_s = User.objects.filter(username__contains='1')
print(user1_s)
# 查询用户名已以'name1'开头的用户
user2_s = User.objects.filter(username__startswith='name1')
print(user2_s)
# 查询邮箱以'@qq.com'结尾的用户
user3_s = User.objects.filter(email__endswith='@qq.com')
print(user2_s)
范围查询
范围:in
查询username属于[‘name1’,‘name2’]的user对象:
users=User.objects.filter(username_in=[‘name1’,‘name2’]
F对象和Q对象
同行数据字段互相比较:
from django.db.mldels import F
逻辑比较
from django.db.models import Q
例子:
if __name__ == '__main__':
main()
print('-'*30)
from user.models import *
from django.db.models import F
# 查询在第一次创建后,发生修改的对象
user_s = User.objects.filter(updateDatetime__gt=F('createDatetime'))
print(user_s)
if __name__ == '__main__':
main()
print('-'*30)
from user.models import *
from django.db.models import Q
# 查询余额大于5000块的男性
print(User.objects.filter(money__gt=5000, gender=0)) # 第一种 逗号
print(User.objects.filter(Q(money__gt=5000) & Q(gender=0))) # 第二种 Q(【条件】)&Q(【条件】)
# 查询余额大于5000块的男性和余额大于2000的女性
print(User.objects.filter(Q(money__gt=5000, gender=0) | Q(money__gt=2000, gender=1)))