Python Web框架 Django - Django查询相关、一对一关系模型及多表查询

django查询

filter:查询满足条件的对象,得到QuerySet,查询结果不存在时,得到QuerySet[]

# 查询年龄等于18的信息
 stus = Student.objects.filter(age=18)

exclude: 查询不满足条件的对象, 结果得到QuerySet

# 获取不叫小小明的学生的信息
stus = Student.objects.exclude(name='小小明')

get:获取唯一的满足条件的对象,且查询的条件必须存在如果查询结果多于一个,则报错

# 查询name=xx的学生信息
stu = Student.objects.get(name='小小明')

first() : 获取结果中的第一个
last() : 获取结果中的最后一个
all() : 获取所有

多条件查询:
对象.objects.filter(条件1).filter(条件2) 或者
对象.objects.filter(条件1, 条件2)

    # 查询年龄等于18且性别为女的学生信息
    stus = Student.objects.filter(age=18).filter(gender=0)
    stus = Student.objects.filter(age=18, gender=0)

排序:order_by
对象.objects.order_by(条件):按条件升序
对象.objects.order_by(-条件):按条件降序

    # 排序order_by, 降序-id,在SQL中id desc,升序id, 在SQL中 id asc
    stus = Student.objects.all().order_by('-id')

是否存在:exists
有值返回True,没有值返回False

    # 判断name=王昭君 的学生存不存在, 存在返回True,不存在返回False
    stu = Student.objects.filter(name='王昭君').exists()
    if stu:
        print('1')
    else:
        print('2')

获取对象的值,结果是字典

    # 获取对象的值
    stus_value = Student.objects.all().values()

比较运算:
contains:是否包含,大小写敏感
icontains:是否包含,大小写不敏感
startwith,endwith:以values开头或结尾,大小写敏感

    # 查询姓名中包含’大‘的学生信息
    # 类似于 like '%大%'
    stus = Student.objects.filter(name__contains='大')

    # 类似于like'%大'
    stus = Student.objects.filter(name__endswith='大')

    # 类似于like'大%'
    stus = Student.objects.filter(name__startswith='大')

__in方法:

# sql:select * from xxx where id in (1,2,3)
stus = Student.objects.filter(id__in=[1, 2])

stus = Student.objects.filter(pk__in=[1, 2])

大于:gt, 大于等于gte
小于:lt, 小于等于lte

stus = Student.objects.filter(age__lte=19)

查询平均年龄

stus = Student.objects.all()
ages = 0
for stu in stus:
     ages += stu.age
avg_age = ages / len(stus)

聚合aggregate

avg_age = Student.objects.all().aggregate(Avg('age'))
sum_age = Student.objects.all().aggregate(Sum('age'))

或者条件、非条件、并且条件
查询age=18或者gender=1的学生信息
Q()
from django.db.models import Q

stus = Student.objects.filter(Q(age=18), Q(gender=1))

stus = Student.objects.filter(Q(age=18) & Q(gender=1))

stus = Student.objects.filter(Q(age=18) | Q(gender=1))

stus = Student.objects.filter(~Q(age=18) | Q(gender=1))

查询语文成绩比数学成绩大的学生信息
F()
from django.db.models import F

stus = Student.objects.filter(chinese__gt=F('math'))

# 查询语文成绩比数学成绩大10分的学生信息
stus = Student.objects.filter(chinese__gt=F('math') + 10)

模型的一对一关系以及一对一关系的多表查询

一对一模型的定义:
OneToOne等价于 foreign_key, 且约束unique=True

class StuInfo(models.Model):
    phone = models.CharField(max_length=11)
    address = models.CharField(max_length=50)
    # OneToOne等价于  foreign_key, 且约束unique=True
    stu = models.OneToOneField(Student)

    class Meta:
        db_table = 'stu_info'
        verbose_name = '学生信息拓展'
        verbose_name_plural = '学生信息拓展'

一对一关系的多表查询:
正向查询:

def sel_info_by_stu(request):
    # 通过学生信息查拓展表信息
    # 查询大明的电话号码
    stu = Student.objects.filter(name='貂蝉').first()
    # 第一种方法
    # stu_info = StuInfo.objects.filter(stu_id=stu.id).first()
    # stu_info = StuInfo.objects.filter(stu=stu).first()
    # phone = stu_info.phone

    # 第二种方法
    stu_info = stu.stuinfo
    phone = stu_info.phone
    return HttpResponse(phone)

反向查询:

def sel_by_info(request):
    # 查询号码为6543210的学生信息
    stu_info = StuInfo.objects.get(phone='6543210')
    stu = stu_info.stu
    name = stu.name
    return HttpResponse(name)

常用的方法:

方法 用法
__exact 精确等于 like ‘aaa’
__iexact 精确等于 忽略大小写 ilike ‘aaa’
__contains 包含 like ‘%aaa%’
__icontains 包含 忽略大小写 ilike ‘%aaa%’,但是对于sqlite来说,contains的作用效果等同于icontains。
__gt 大于
__gte 大于等于
__lt 小于
__lte 小于等于
__in 存在于一个list范围内
__startswith 以…开头
__istartswith 以…开头 忽略大小写
__endswith 以…结尾
__iendswith 以…结尾,忽略大小写
__range 在…范围内
__year 日期字段的年份
__month 日期字段的月份
__day 日期字段的日
__isnull=True/False __isnull=True 与 __exact=None的区别

返回新的QuerySet的API

方法名 解释
filter() 过滤查询对象
exclude() 排除满足条件的对象
annotate() 使用聚合函数
order_by() 对查询集进行排序
reverse() 反向排序
distinct() 对查询集去重
values() 返回包含对象具体值的字典的QuerySet
values_list() 与values()类似,只是返回的是元组而不是字典
dates() 根据日期获取查询集
datetimes() 根据时间获取查询集
none() 创建空的查询集
all() 获取所有的对象
union() 并集
intersection() 交集
difference() 差集
select_related() 附带查询关联对象
prefetch_related() 预先查询
extra() 附加SQL查询
defer() 不加载指定字段
only() 只加载指定的字段
using() 选择数据库
select_for_update() 锁住选择的对象,直到事务结束
raw() 接收一个原始的SQL查询
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容