Django学习4

ORM单表操作

类 --- 表
类对象 --- 一行数据
类属性 --- 字段

#创建记录方式一
student_obj = models.Student(
    name='大壮',
    age=48,
)
student_obj.save()

#创建记录方式二
models.Student.objects 对象控制器
new_obj = models.Student.objects.create(name='雪飞',age=18)	#也可写成**{'name':'雪飞','age':18}
print(new_obj)        # Student object -- model对象  .属性可以获取对应字段的数据
print(new_obj.name)  # 雪飞
print(new_obj.age)  # 18

#创建记录方式三 -- 批量创建1
objs = []
for i in range(20):
    obj = models.Student(
        name='玉溪%s'%i,
        age=10+i,
    )
    objs.append(obj)
models.Student.objects.bulk_create(objs)

#创建记录方式四 -- 有则更新无则添加 update_or_create
models.Student.objects.update_or_create(
    name = '双喜',
    defaults={
        'age':26
    }
)

# 添加日期数据
# 方式一 datetime.datetime对象
import datetime
current_date = datetime.datetime.now()
models.Birthday.objects.create(name='小智',date=current_date)
# 方式二 字符串
models.Birthday.objects.create(name='路比',date='2000-6-18')

#删除 delete
models.Student.objects.get(id=1).delete()   # 用model对象调用delete方法(get方法返回的是model对象)
models.Student.objects.filter(name='阿强').delete()   # 用queryset对象也可调用delete方法
models.Student.objects.all().delete()   # 删除所有数据

#更新
models.Student.objects.get(name='阿强').update(age=30)    # model对象没有更新方法 报错信息:'Student' object has no attribute 'update'
models.Student.objects.filter(name='阿强').update(age=30)   # 只能queryset对象调用

查 (简单)

简单查询(三剑客 all filter get)
1.查询所有的数据  .all方法  返回的是QuerySet集合
all_objs = models.Student.objects.all()
# print(all_objs)   # <QuerySet [<Student: Student object>, <Student: Student object>, <Student: Student object>]> -- 类似于列表 -- queryset集合
# for i in all_objs:
#     print(i.name)   # 小智 小霞 小刚

    print(all_objs)  # < QuerySet[ < Student: 小智 >, < Student: 小霞 >, < Student: 小刚 >] >(改写了__str__)

2.条件查询  .filter方法  返回的是QuerySet集合,查询不到内容不会报错,返回<QuerySet []>
objs = models.Student.objects.filter(id=3)  # 找id为3的记录
print(objs)     # <QuerySet [<Student: 小刚>]>

3.条件查询  .get方法  返回的是model对象!而且get方法有且必须只有一个结果,否则报错(为空或者多了)!
objs = models.Student.objects.get(id=3)  # 找id为3的记录
print(objs)     # 小刚

查询接口

<1> all():                  查询所有结果,结果是queryset类型

<2> filter(**kwargs):	   查询与所给筛选条件相匹配的对象,结果是queryset类型
    #多条件
    models.Student.objects.filter(id=7,name='吴尊').update(name='无极尊',age=27,)
    #打散形式传参
    models.Student.objects.filter(**{'id':7,'name':'无极尊'}).update(age=100,)
    #queryset类型可以调用filter再过滤
    models.Student.objects.all().filter(id=7)

<3> get(**kwargs):          返回与所给筛选条件相匹配的对象,model对象,返回结果有且只有一个,否则报错
    
<4> exclude(**kwargs):	   排除符合条件的对象  object控制器和queryset集合都可以调用,返回结果是queryset类型
    object控制器调用:
    query = models.Student.objects.exclude(id=3)
    QuerySet对象调用:
    query = models.Student.objects.filter(age=26).exclude(id=24)

<5> order_by(*field):    	queryset类型的数据来调用,对查询结果排序,返回值还是queryset类型
    query = models.Student.objects.all().order_by('age','-id')  # 按age升序排,age相同的时候按id降序排
  
<6> reverse():              queryset类型的数据来调用,在排序的结果基础上反向排序,返回值还是queryset类型
    query = models.Student.objects.all().order_by('id').reverse()
    
<7> count():			   	queryset类型的数据来调用,返回数据库中匹配查询(QuerySet)的对象数量(数字)。
    num = models.Student.objects.all().count()
    
<8> first(): 			   	queryset类型的数据来调用,返回第一条记录,结果为model对象
<9> last():					queryset类型的数据来调用,返回最后一条记录,结果为model对象
   
<10> exists():				queryset类型的数据来调用,如果QuerySet包含数据,就返回True,否则返回False
    obj = models.Student.objects.all().filter(name='无极尊').exists()
    if obj:print(obj)
    else:print('nothing...')
    
<11> values(*field):		返回里面是字典的queryset类型(一个字典就是一行数据,字典的键就是字段)
    query = models.Student.objects.filter(age=26).values()
    print(query)    # <QuerySet [{'id': 24, 'name': '相玺16', 'age': 26}, {'id': 28, 'name': '文洋', 'age': 26}]>
    # values可以指定字段
    query = models.Student.objects.filter(age=26).values('name','age')
    
<12> values_list(*field): 	返回里面是元组的queryset类型(一个元组就是一行数据,元组里面的每一项对应一个字段)
    query = models.Student.objects.filter(age=26).values_list()
    print(query)    # <QuerySet [(24, '相玺16', 26), (28, '文洋', 26)]>
    # values_list也可以指定字段
    query = models.Student.objects.filter(age=26).values_list('name','age')
    
<13> distinct(): 		values和values_list得到的queryset类型的数据来调用,从返回结果中剔除重复纪录,返回结果还是queryset类型
    models.Student.objects.all().values('age').distinct()
    

基于双下划线的模糊查询

# __ 找id>7的
query = models.Student.objects.filter(id__gt=7)
# __ 找id>=7的
query = models.Student.objects.filter(id__gte=7)
# 找id<7的
query = models.Student.objects.filter(id__lt=7)
# 找id<=7的
query = models.Student.objects.filter(id__lte=7)

# in
query = models.Student.objects.filter(id__in=[7, 8, 9])  # id值等于这三个里面的任意一个的对象

# 范围  相当于between...and...
query = models.Student.objects.filter(id__range=[5,10])  # id值在[5,10]内的

# 找name字段里有'相玺'的对象,只适用于字符串类型的字段
query = models.Student.objects.filter(name__contains='相玺')

# contains基础上 + 不区分大小写
query = models.Student.objects.filter(name__icontains='python')

# 找name字段以'相'开头的对象, istartswith 不区分大小写
query = models.Student.objects.filter(name__startswith='相')

# 找name字段以'飞'结尾的对象, iendswith 不区分大小写
query = models.Student.objects.filter(name__endswith='飞')

# 日期结合__查询:
# 找出生年为2000,月为07月的
query = models.Birthday.objects.filter(date__year='2000',date__month='07')
# 找出生年为2000,月为07月,日大于10的
query = models.Birthday.objects.filter(date__year='2000',date__month='07',date__day__gt='10')

# 以此类推......
原文地址:https://www.cnblogs.com/straightup/p/13425561.html