Django ORM单表操作常用字段

1、创建Django项目

#在app的models.py中写入:
class User(models.Model):
    name = models.CharField(max_length=32)
    age = models.IntegerField()
    register_time = models.DateField()


2、单独的py文件测试ORM操作

#单独的py文件测试ORM操作需要先配置以下内容
import os

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day58.settings")
    import django
    django.setup()
    from app01 import models    # 这一句话必须在最下面导入


3、测试ORM的python文件

import os

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day58.settings")
    import django
    django.setup()
    from app01 import models

    # 新增数据
    # 基于create创建
    user_obj = models.User.objects.create(name='tank',age=73,register_time='2019-2-14')
    print(user_obj.register_time)
    # 基于对象的绑定方法创建
    user_obj = models.User(name='kevin',age=30,register_time='2019-1-1')
    user_obj.save()
    from datetime import datetime
    ctime = datetime.now()
    models.User.objects.create(name='egon', age=18, register_time=ctime)


    # 修改数据
    # 基于对象
    user_obj = models.User.objects.filter(name='jason').first()
    user_obj.age = 17
    user_obj.save()
    # 基于queryset
    models.User.objects.filter(name='kevin').update(age=66)


    # 删除数据
    # 基于queryset
    models.User.objects.filter(name='egon').delete()
    # 基于对象
    user_obj = models.User.objects.filter(name='owen').first()
    user_obj.delete()


    # 查询数据
    # < 1 > all(): 查询所有结果

    # < 2 > filter(**kwargs): 它包含了与所给筛选条件相匹配的对象
    # filter内可以放多个限制条件但是需要注意的是多个条件之间是and关系
    res = models.User.objects.filter(name='jason',age=17)
    print(res)

    # < 3 > get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。
    # 不推荐使用

    # < 4 > exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象
    res = models.User.objects.exclude(name='jason')
    print(res)

    # < 5 > order_by(*field): 对查询结果排序('-id') / ('price')
    res = models.User.objects.order_by('age')   # 默认是升序
    res = models.User.objects.order_by('-age')  # 可以在排序的字段前面加一个减号就是降序
    res = models.User.objects.order_by('name')
    res = models.User.objects.order_by('-name')
    print(res)

    # < 6 > reverse(): 对查询结果反向排序 >> > 前面要先有排序才能反向
    res = models.User.objects.order_by('age').reverse()
    print(res)

    # < 7 > count(): 返回数据库中匹配查询(QuerySet) 的对象数量。
    res = models.User.objects.count()
    res = models.User.objects.all().count()
    print(res)

    # < 8 > first(): 返回第一条记录
    res = models.User.objects.all().first()
    res = models.User.objects.all()[0]  # 不支持负数的索引取值
    print(res)

    # < 9 > last(): 返回最后一条记录
    res = models.User.objects.all().last()
    print(res)

    # < 10 > exists(): 如果QuerySet包含数据,就返回True,否则返回False
    res = models.User.objects.all().exists()
    res1 = models.User.objects.filter(name='jason',age=3).exists()
    print(res,res1)

    # < 11 > values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列model的实例化对象,
    而是一个可迭代的字典序列
    res = models.User.objects.values('name')  # 列表套字典
    res = models.User.objects.values('name','age')  # 列表套字典
    print(res)

    # < 12 > values_list(*field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
    res = models.User.objects.values_list('name','age')  # 列表套元祖
    print(res)

    # < 13 > distinct(): 从返回结果中剔除重复纪录  去重的对象必须是完全相同的数据才能去重
    res = models.User.objects.values('name','age').distinct()
    print(res)


    # 神奇的双下划线查询
    # 查询年龄大于44岁的用户
    res = models.User.objects.filter(age__gt=44)
    print(res)
    # 查询年龄小于44岁的用户
    res = models.User.objects.filter(age__lt=44)
    print(res)
    # 查询年龄大于等于44岁的用户
    res = models.User.objects.filter(age__gte=44)
    print(res)
    # 查询年龄小于等于44岁的用户
    res = models.User.objects.filter(age__lte=44)
    print(res)

    # 查询年龄是44或者22或者73的用户
    res = models.User.objects.filter(age__in=[44,22,73])
    print(res)

    # 查询年龄在22到44范围内
    res = models.User.objects.filter(age__range=[22,44])
    print(res)


    # 用的是mysql数据库
    # 查询年份
    res = models.Book.objects.filter(publish_date__year=2019)
    print(res)


    # 查询名字中包含字母n的用户  sqlite数据库演示不出来大小写的情况!!!
    res = models.Author.objects.filter(name__contains='n')
    res = models.Author.objects.filter(name__icontains='n')
    print(res)
    res = models.User.objects.filter(name__icontains='e')  # 无视大小写
    print(res)

    # 查询名字以j开头的用户
    res = models.User.objects.filter(name__startswith='j')
    print(res)
    # 查询名字以n结尾的用户
    res = models.User.objects.filter(name__endswith='n')
    print(res)

    # 查询注册是在2017年的用户
    res = models.User.objects.filter(register_time__year=2017)  # sqlite对日期格式不太精准
    print(res)


4、13个必会操作总结

返回QuerySet对象的方法有:
all()
filter()
exclude()
order_by()
reverse()
distinct()

特殊的QuerySet:
values()       返回一个可迭代的字典序列
values_list() 返回一个可迭代的元祖序列

返回具体对象的:
get()
first()
last()

返回布尔值的方法有:
exists()

返回数字的方法有:
count()


5、只要是queryset对象就可以无限制的点queryset方法

models.User.objects.filter().filter().filter().count()
原文地址:https://www.cnblogs.com/weiyiming007/p/12361655.html