模型类的增删改和查询

交互式编程

交互式:
python manage.py shell

导入user中的模型类

from user.models import *

退出:
exit

增加数据

save方法:调用save方法后,user对象封装写入数据库中的数据内容

user = User()
user.username = ‘name1’
user.id

user.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)))


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值