Django5 模型定义与使用

一、Django5 模型定义

ORM框架是一种程序技术,用于实现面向对象编程言中不同类型系统的数据之间的转换。从效果上说,它创建了一个可在编程语言中便用的”虚拟对象故据车”,通过对虚拟对象数据库的操作以而实现对目标数据障的操作,虚拟对象数据率与目标教据是相互对应的。在 Diango5中,虚拟对象数据库也称为模型,通过模型实现对目标数揭库的谈写操作,实现方法如下:

       
        1.配置目标数据库,在settings.py中设置配置属性


        2.构建虚拟对象数据库,在App 的models.py文件中以类的形式定义横型


        3.通过横型在目标教据库中创建相应的教据表
        4.在其他模块(如视图函教)里使用模型来实现目标数据库的读写操作

二、模型查询

        在新建模型后,到方法中调用模型

视图层中调用模型并查询所有 并渲染到模板

重启并访问

与数据库中一直

ORM 的一些操作实例与方法

#查询所有信息
adminList= Admin.objects.all()

#获取数据集的第一条数据的bookName属性值
print (adminList[0].balance)

#返回前2条数据 select * from t_book ]imit 2
adminList= Admin.objects.all()[:2]

#查询指定字段
adminList= Admin.objects .values("name","balance")

#查询指定字段 数据以列表方式返回,列表元秦以元组表示
adminList= Admin.objects.values_list("name","balance")

#获取单个对象,一般是根据id查询
admin= Admin.objects.get (id=2)
print (admin.name)

#提供了raw方法允许使用原生SQL语句实现对Model的查询
admin = Admin.objects.raw('SELECT id,content FROM ly_admin WHERE name= %s', ['龙'])

# SQL的不等于查询,在Q查询中用“~”即可
# SQL select  from ly_admin where not (id=1)
adminList = Admin.objects.filter(~Q(id=1))

#也可以使用exclude 返回满足条件之外的数据 实现不等于查询
adminList = Admin.objects.exclude(id=1)

#使用count ()方法,返回满足查询条件后的数据量
admin = Admin.objects.filter(id=2).count()
print (admin)

# distinct()方法,返回去重后的数据
adminList = Admin.objects .values("name").distinct()
print (adminList )

#使用order_by设置排序
# adminList= Admin.objects.order_by("price")
adminList= Admin.objects .order_by("-id")

# annotate类似于SQL里面的GROUP BY方法
# 如果不设置values,默认对主键进行GROUIP B分组
#SQl: select status, sum(balance) As 'price_sum' from ly_admin GROUP BY status
admin = Admin.objects.values('status").annotate(Sum('balance"))
# SQl: select bookType_id, AVG(balance) A 'price_sum' from ly_admin GROUP BY status
admin2 = Admin.objects .values ( 'status').annotate(Avg( "balance'))

模型分页

adminList =  Admin.objects.all()

# 2是每页数量
p = Paginator(adminList, 2)

# 3是取出数量
adminListPage = p.page(3)

三、高级查询匹配符

在使用 filter 和 get 使用下面的匹配符实现

匹配符使用说明
__exactfilter (job__exact=开发)精确等于,如SQL的like'开发”
__iexactfllter (job_lexact=开发)精确等于并忽略大小写。
__containsfilter (job__contains=开发)模糊匹配,如SOL的like%荣耀%”。
__icontainsfilter (job_icontains=开发)模糊匹乱,忽略大小写。
__gtfilter (job_gt=5)大于。
__gtefilter (job_gte=5)大于等于。
__ltfilter (job_lt=5)小于。
__ltefilter (job_lte=5)小于等于。
__infilter (job_in=[1,2,3j)判断是否在列表内。
__startswithfilter (job_startswith=”开发)以。。。开头。
__istartswithfilter (job_istartswith=开发)以。。。开头并忽略大小写。
__endswithfilter (job__endswith=开发)以。。。结尾。
__iendswithfilter (job_iendswith=开发)以。。。结尾并忽略大小写
__rangefllter (job__range=开发)在。。。范国内。
__yearfilter (job_year='2018)日期字段的年份。
__monthfilter (job_month=12)日期字段的月份。
__dayfilter (job_day=30)日期字段的天数。
__isnullfilter (job_isnull=True/False)判断是否为空。

四、新增与批量新增

    admin = Admin()
    admin.name = request.POST.get('name')
    admin.phone = request.POST.get('phone')
    admin.balance = request.POST.get('balance')
    admin.status = request.POST.get('status')

    # 单个新增
    admin.save()
    # 批量新增
    Admin.objects.bulk_create()

五、修改数据

# 假设我们有一个名为 `MyModel` 的Django模型,它有一个字段 `name`。
 
# 导入模型
from myapp.models import MyModel
 
# 假设我们已经有了一个对象的ID
object_id = 1
 
# 获取对象
obj = MyModel.objects.get(pk=object_id)
 
# 修改对象的属性
obj.name = '新名称'
 
# 保存修改
obj.save()

六、删除数据

删除单个数据

from myapp.models import MyModel
 
# 假设我们要删除主键为1的记录
obj = MyModel.objects.get(pk=1)
obj.delete()

如果你想一次性删除多个对象,可以使用delete()方法的queryset参数

# 删除所有符合条件的记录
MyModel.objects.filter(some_field='some_value').delete()

七、事务

from django.db import transaction
from myapp.models import MyModel
 
def perform_transaction():
    # 开始一个事务
    with transaction.atomic():
        # 在这个块内的代码会作为一个事务执行
        # 如果在这个块内发生异常,事务会被自动回滚
        try:
            # 创建一个新的模型实例
            instance = MyModel.objects.create(name='Example')
            # 如果这里发生异常,事务将会回滚
            1 / 0  # 这将引发一个除以零的异常
        except Exception as e:
            # 异常处理
            print(f"发生异常: {e}")
            # 如果需要,可以选择在这里回滚事务
            transaction.rollback()
        else:
            # 如果没有异常发生,事务会自动提交
            print("事务成功提交")
 
            transaction.savepoint_commit()
# 调用函数
perform_transaction()

在这个例子中,transaction.atomic() 创建了一个原子块,确保在这个块内的所有数据库操作要么全部成功,要么全部失败,从而保持数据库状态的一致性。如果在 with 块内发生了异常,事务会自动回滚。如果没有异常发生,事务会在离开 with 块时自动提交。

或者使用下面这种

@transaction.atomic
def transger(request):
    """
    转账
    """

    tid = transaction.savepoint()

    try:
        admin = Admin.objects.get(id=1)
        admin.balance = admin.balance - 100

        admin2 = Admin.objects.get(id=2)
        admin2.balance = admin2.balance + 100

        transaction.savepoint_commit(tid)

    except Exception as e:
        print(e)
        transaction.savepoint_rollback(tid)

    return HttpResponse('转账成功')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值