一、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 使用下面的匹配符实现
匹配符 | 使用 | 说明 |
__exact | filter (job__exact=开发) | 精确等于,如SQL的like'开发” |
__iexact | fllter (job_lexact=开发) | 精确等于并忽略大小写。 |
__contains | filter (job__contains=开发) | 模糊匹配,如SOL的like%荣耀%”。 |
__icontains | filter (job_icontains=开发) | 模糊匹乱,忽略大小写。 |
__gt | filter (job_gt=5) | 大于。 |
__gte | filter (job_gte=5) | 大于等于。 |
__lt | filter (job_lt=5) | 小于。 |
__lte | filter (job_lte=5) | 小于等于。 |
__in | filter (job_in=[1,2,3j) | 判断是否在列表内。 |
__startswith | filter (job_startswith=”开发) | 以。。。开头。 |
__istartswith | filter (job_istartswith=开发) | 以。。。开头并忽略大小写。 |
__endswith | filter (job__endswith=开发) | 以。。。结尾。 |
__iendswith | filter (job_iendswith=开发) | 以。。。结尾并忽略大小写 |
__range | fllter (job__range=开发) | 在。。。范国内。 |
__year | filter (job_year='2018) | 日期字段的年份。 |
__month | filter (job_month=12) | 日期字段的月份。 |
__day | filter (job_day=30) | 日期字段的天数。 |
__isnull | filter (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('转账成功')