python笔记 django ORM

本文介绍了Django的ORM机制,包括模型与数据库表的映射、模型间的关系(多对一、一对一、多对多),以及ORM的CRUD操作。详细讲解了如何创建、查询、更新和删除数据,同时还提供了过滤、排除、SQL语句查看等高级用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#### 1 .什么是ORM (Object Relational Mapping )
它的作用是在关系型数据库和业务实体对象做一个映射,我们在操作具体业务对象的时候就可以省去了和SQL语句打交道,只需要简单的操作对象的属性和方法。


我们在model这个模块写的类名相当于数据库中的表名
根据这个类创建的对象相当于数据库表中的一个字段
字段名.id ,字段名2.title  表示这个字段对对应的数据




#### 模型与模型之间的关系
1.多对一关系
举个列子 一个出版社出于版权问题,一本书只能由一个出版社出版,但是出版社可以有多本书的出版权,这里就是多对一的关系,通过通过相应的表来来建立一个联系,用ForeignKey来实现


class Author(models.Model):
     name = CharField(length=10)


class Book(models.Model):
    title = CharField(max_length=10)
    author = ForeignKey(Author)
2.一对一
3.多对多
class Author(models.Model):
     name = CharField(length=10)


class Book(models.Model):
    title = CharField(max_length=10)
    author = ManytoManyField(Author)


关系数据库本身没多多对多的关系,Django是在数据库中新建了一张表专门用来存储多对多的关系。
记得引用的ForeignKey和ManyToManyField一定要在Author的后面,如果不在后面要将参数写成字符串形式('Author')。并且ForeignKey和ManyToManyField这段关系在两个类里面都可以声明,作用是一样的,django会自动为我们把另外一半关系给对称过去。




#### ORM 中的CRUD操作


#### Create:
方法一:
task = {'a':'b'}
Task.object.create(**task)
#这种方法的好处是可以直接把字典存到数据库里面
方法二:
task = Task(title='明天吃饭吗')
task.save()


#### Retrieve


res = Task.objects.all()
res = Task.objects.filter(id=0)  #对数据进行过滤,可以查询某一段数据
for row in res:
    print(row.id,row.title)  #不要直接将取到的所有数据进行for遍历查找用到,比如用到filter过滤,否则数据大服务器会蹦掉
    
filter
res = Task.objects.filter(id__gt=2)  #查询id大于2


#使用filter进行登录验证
user= UserInfo.objects.filter(username=v,userpwd=p).first()
if not user:
    print('登录失败')
else:
    print('登录成功')
    
     含义          后缀               
  大于          __gt             
  小于              __lt             
  包含          __contains       
  不区分大小写      __iexact="abc"   
  包含abc且不区分大小写 __icontains="abc"
  正则表达式        __regex="^abc"   
  正则表达式不区分大小写 __iregex="^abc"  
                               


filter实现or
 
    
from django.db.models import Q
Item.objects.filter(Q(creator=owner) | Q(moderated=False))


exclude
Person.objects.filter(name__contains="文").exclude(age__lt=18) # 找出名称包含'文', 且排除年龄小于18岁的人


查看执行的SQL语句
Task.objects.all().query
获取指定列的结果(元组样式)


Task.objects.values_list('id','title')


获取指定列的结果(字典样式)


Task.objects.values('id', 'title')


提示:values_list 和 values 返回的并不是真正的 列表 或 字典,也是 queryset,他们也是 lazy evaluation 的(惰性评估,通俗地说,就是用的时候才真正的去数据库查)


Update


#根据指定某个条件修改
task= Task.objects.get(id=2)
task.title = 'new content'
task.save()
    
# 根据过滤条件修改
Task.objects.filter(id__lt=5).update(title='hello')
    
# 全部修改
Task.objects.all().update(title='hello world')
    
Delete
### 指定删除
task = Task.objects.get(id=2)
task.delete()
### 批量删除
Task.objects.filter(id_lt=10).delete()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值