Django-orm相关单表操作

一般操作

被查询数据表:

class Person(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32, unique=True)
    age = models.IntegerField()
    birth = models.DateField(auto_now_add=True)
  • all 查询 查询所有结果
print("all".center(80))
    ret = models.Person.objects.all()
    print(ret)

得到的是Person我们可以通过以下方法显示Person对应字段的值
第一方法:更改被查数据表,引用str方法

class Person(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32, unique=True)
    age = models.IntegerField()
    birth = models.DateField(auto_now_add=True)
    
    def __str__(self):
        return self.name
 print("all".center(80))
    ret = models.Person.objects.all()
    print(ret)
运行结果:
                                      all                                       
<QuerySet [<Person: 小布什>, <Person: 小黄>, <Person: 小叶>, <Person: 老佘>, <Person: 老雄>]>

第二种方法:遍历取值

    print("all".center(80))
    ret = models.Person.objects.all()
    for i in ret:
        print(i.name)
运行结果:
                                      all                                       
小布什
小黄
小叶
老佘
老雄

第三种方法:values_list()取值

   print("all".center(80))
    ret = models.Person.objects.all()
    ret = models.Person.objects.all().values_list("name","birth")
    print(ret)
运行结果:

                                      all                                       
<QuerySet [('小布什', datetime.date(1981, 5, 13)), ('小黄', datetime.date(2022, 5, 26)), ('小叶', datetime.date(2022, 5, 17)), ('老佘', datetime.date(2022, 3, 9)), ('老雄', datetime.date(2004, 3, 1))]>

举一反三:以下12种查询取值方法原理同all查询,这里就不再重复。

  • filter()它包含了与所给筛选条件相匹配的对象
  print("filter".center(50))
    ret = models.Person.objects.filter(id=2)
    for i in ret:
        print(i.name,i.birth)
运行结果
                      filter                      
小黄 2022-05-26
  • get()返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误
    print("get".center(50))
    ret = models.Person.objects.get(name='小布什')
    print(ret.birth)
运行结果
                       get                        
1981-05-13
  • exclude它包含了与所给筛选条件不匹配的对象
  print("exclude".center(50))
   ret = models.Person.objects.exclude(name="小布什")
   for i in ret:
       print(i.name,i.birth)
运行结果
                    exclude                      
小黄 2022-05-26
小叶 2022-05-17
老佘 2022-03-09
老雄 2004-03-01
  • values() 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列model的实例化对象,而是一个可迭代的字典序列
  print("values".center(50))
    ret = models.Person.objects.filter(id=5).values("name")
    print(ret)
运行结果
                      values                      
<QuerySet [{'name': '老雄'}]>
  • values_list(): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
    print("values_list".center(50))
    ret = models.Person.objects.filter(id=5).values_list("name","birth")[0]
    print(ret[0],ret[1])
                   values_list                    
老雄 2004-03-01
  • order_by(): 对查询结果排序
    实现排序有两种方式,一种是在被查询的数据表上class Meta:
class Person(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32, unique=True)
    age = models.IntegerField()
    birth = models.DateField(auto_now_add=True)
    class Meta:
        ordering = ("birth",)

另一种方法:

    print("order_by".center(50))
    ret = models.Person.objects.all().order_by()
    for i in ret:
        print(i.id)
                     order_by                     
1
2
3
4
5
  • reverse(): 对查询结果反向排序,请注意reverse()通常只能在具有已定义顺序的QuerySet上调用(在model类的Meta中指定ordering或调用order_by()方法)。
   print("reverse".center(50))
    ret = models.Person.objects.all().reverse()
    for i in ret:
        print(i.id)
  • distinct(): 从返回结果中剔除重复纪录(如果你查询跨越多个表,可能在计算QuerySet时得到重复的结果。此时可以使用distinct(),注意只有在PostgreSQL中支持按字段去重。)
  • count(): 返回数据库中匹配查询(QuerySet)的对象数量。
 print("count".center(50))
    ret =models.Person.objects.filter(id__gt=2).count()
    print(ret)
运行结果:
                      count                       
3
  • first() 返回第一条记录-
 print("first".center(50))
    ret = models.Person.objects.first()
    print(ret.name)
  • last(): 返回最后一条记录
    print("last".center(50))
    ret = models.Person.objects.last()
    print(ret.name)
  • exists(): 如果QuerySet包含数据,就返回True,否则返回False
   print('exists'.center(50))
    ret = models.Person.objects.all().exists()
    print(ret)
运行结果:
                      exists                      
True

单表查询之双下划线

models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值

models.Tb1.objects.filter(id__in=[11, 22, 33]) # 获取id等于11、22、33的数据
models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in

models.Tb1.objects.filter(name__contains="ven") # 获取name字段包含"ven"的
models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感

models.Tb1.objects.filter(id__range=[1, 3]) # id范围是1到3的,等价于SQL的bettwen and

类似的还有:startswith,istartswith, endswith, iendswith

date字段还可以:
models.Class.objects.filter(first_day__year=2017)

  • id__gt,id__lt
   ret = models.Person.objects.filter(id__gt=2,id__lt=6)
    for i in ret:
        print(i.id,i.name,i.birth)
3 小叶 2022-05-17
4 老佘 2022-03-09
5 老雄 2004-03-01
  • id__in
ret = models.Person.objects.filter(id__in=[2,4,5])
    for i in ret:
        print(i.id, i.name, i.birth)
2 小黄 2022-05-26
4 老佘 2022-03-09
5 老雄 2004-03-01
  • exclude(id__in=[]) 不含
  ret = models.Person.objects.exclude(id__in=[2,4,5])
    for i in ret:
        print(i.id, i.name, i.birth)
1 小布什 1981-05-13
3 小叶 2022-05-17
  • contains
ret = models.Person.objects.filter(id__gt=2,name__contains="小")
    for i in ret:
        print(i.name,i.birth)
运行结果
小叶 2022-05-17
  • id__range
 ret = models.Person.objects.filter(id__range=[2,5])
    for i in ret:
        print(i.name)
运行结果
小黄
小叶
老佘
老雄
  • date用法
  ret = models.Person.objects.filter(birth__year=2022)
    for i in ret:
        print(i.name,i.birth)
运行结果
小黄 2022-05-26
小叶 2022-05-17
老佘 2022-03-09
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355

推荐阅读更多精彩内容

  • 一般操作 看专业的官网文档,做专业的程序员! 非常重要的13条 <1> all():查询所有结果<2> filte...
    可笑的黑耀斑阅读 544评论 0 0
  • 前言 Django框架功能齐全自带数据库操作功能,本文主要介绍Django的ORM框架 https://www.c...
    许华锋阅读 1,929评论 0 0
  • ORM 映射关系:表名 <-------> 类名字段 <-------> 属性表记录 <------->类实例...
    lkning阅读 478评论 0 0
  • ORM ORM框架的目的是不再使用SQL语句,让用户使用对象类和对象的方式和这个框架内部的方法来进行数据库操作,对...
    Brown新西兰波浪哥阅读 279评论 0 0
  • Django 中有一个强大的功能,就是ORM,他可以不写sql语句,使用python语法,即可操作数据库。当然也有...
    清风徐来_简阅读 422评论 0 1