Django ORM单表操作

models.py

class UserInfo(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=64)
    age = models.IntegerField()
    date = models.DateField(auto_now=True)  # 自动更新时间
	
    # 方便在admin中管理
    def __str__(self):
        return self.name

views.py

user_obj = models.UserInfo(name='alex', age=20)
user_obj.save()
print(user_obj)

# 添加数据方式2
obj = models.UserInfo.objects.create(name='abc', age=20)
print(obj.name)
print(obj)           

# 添加数据方式3 批量添加
obj_list = []
for i in range(100000):
    obj = models.UserInfo(name='a', age=10)
    obj_list.append(obj)
models.UserInfo.objects.bulk_create(obj_list)

# 删除数据, queryset 和 model 对象都能调用 delete
models.UserInfo.objects.get(id=3).delete()
models.UserInfo.objects.filter(name='abc').delete()
models.UserInfo.objects.all().delete()

# 修改数据 update , model 对象没有 update 方法, 只有 queryset 能调用update
obj = models.UserInfo.objects.filter(name='dadsa').update(age=24)
print(obj)

# 查询所有数据 all方法, 返回 queryset 集合
all_objs = models.UserInfo.objects.all()
print(all_objs)
# # < QuerySet[ < UserInfo: UserInfo object(1) >,
# # < UserInfo: UserInfo object(2) >,
# # < UserInfo: UserInfo object(3) >, 类似列表
for obj in all_objs:
    print(obj)


# 条件查询1 filter 方法, 返回 queryset 集合, 查询不到内容返回空 queryset, 
# queryset 类型可以继续调用filter
obj = models.UserInfo.objects.filter(id=2)
obj = models.UserInfo.objects.filter(name='alex')
print(obj)

# 条件查询2 get 方法, 返回 model 对象, 而且 get 方法必须有且只有一个结果, 否则报错
obj = models.UserInfo.objects.get(id=1)
print(obj)
# 报错1:查询结果多了, 报错2: 没有查询到结果

查询详解

# and
objs = models.UserInfo.objects.filter(id=2, name='alex')
print(objs)
objs = models.UserInfo.objects.filter(**{'name': 'test', 'age': 18})  # get也支持**{}
print(objs)

# exclude 取反 not, objects控制器和queryset对象都能调用, 返回 queryset
objs = models.UserInfo.objects.exclude(id=2, name='alex')
print(objs)

# order_by 排序,可以传多个filed_name,字段前加'-'则为降序, reverse 将查询结果翻转反转
objs = models.UserInfo.objects.order_by('age', '-id').reverse()
print(objs)

# count 计数, queryset 对象调用
num = models.UserInfo.objects.count()
print(num)
alex_num = models.UserInfo.objects.filter(name='alex').count()
print(alex_num)

# last, 返回最后一条数据, queryset 对象调用
obj = models.UserInfo.objects.all().last()
print(obj)

# first, 返回第一条数据, queryset 对象调用
obj = models.UserInfo.objects.filter(name='alex').first()
print(obj)

# exists 查看是否有数据
is_data = models.UserInfo.objects.filter(name='dasdsadas').exists()
print(is_data)

# values/values_list 取值, 返回 queryset, objects 和 queryset 都能调用, 可以指定取哪些字段
data = models.UserInfo.objects.all().values_list() 	 # 元组
print(data)	
data = models.UserInfo.objects.all().values()       	 # 字典
print(data)
data = models.UserInfo.objects.all().values('name')      # 字典
print(data)

# distinct 去重
objs = models.UserInfo.objects.all().values('name').distinct()
print(objs)

基于双下滑线的模糊查询

# gt 大于, gte 大于等于, lt 小于, lte 小于等于
objs = models.UserInfo.objects.filter(id__gt=3)
print(objs)
objs = models.UserInfo.objects.filter(id__gte=3)
print(objs)
objs = models.UserInfo.objects.filter(id__lt=3)
print(objs)
objs = models.UserInfo.objects.filter(id__lte=3)
print(objs)

# in 在 ... 里面
objs = models.UserInfo.objects.filter(id__in=[1,3,5])
print(objs)

# range 从 ... 到 ...
objs = models.UserInfo.objects.filter(id__range=(3,5))  # id__gte=3, id__lte=5
print(objs)

# contains 包含
objs = models.UserInfo.objects.filter(name__contains='test')
print(objs)

# icontains 包含, 不区分大小写
objs = models.UserInfo.objects.filter(name__icontains='test')
print(objs)

# startswith 以 ... 开头,istartswith 不区分大小写
objs = models.UserInfo.objects.filter(name__startswith='a')
print(objs)

# endswith 以 ... 开头,iendswith 不区分大小写
objs = models.UserInfo.objects.filter(name__endswith='x')
print(objs)


# 查询日期
objs = models.UserInfo.objects.filter(date='2020-04-17')
print(objs)
objs = models.UserInfo.objects.filter(date__day=2,date__month=7)
print(objs)
objs = models.UserInfo.objects.filter(date__day__gt=15)
print(objs)
posted @ 2020-05-25 16:45  _Otis  阅读(97)  评论(0编辑  收藏  举报