Django ORM 学习笔记(一)

本文详细介绍了Django ORM中如何进行复杂查询,包括使用Q对象进行AND和OR操作,F()表达式的运用,以及聚合函数如Count、Avg、Max、Min、Sum的使用。同时,讲解了Django ORM的性能优势和如何进行数据库操作优化。
摘要由CSDN通过智能技术生成
  1. 一般在Django程序中查询数据库操作都是在QuerySet里进行的:

    q1 = Entry.objects.filter(headline__startswith="What")
    q2 = q1.exclude(pub_date__gte=datetime.date.today())
    q3 = q1.filter(pub_date__gte=datetime.date.today())
    
  2. 获取ORM对应的sql:

    代码:

     >>> queryset = Event.objects.all()
     >>> str(queryset.query)
     SELECT "events_event"."id", "events_event"."epic_id","events_event"."details", "events_event"."years_ago" FROM "events_event"
    
  3. multiple criteria【评价或做决定的标准,准则,原则】符合多条件【文盲笔记】

  4. 执行AND操作:

    1. filter(<condition_1>, <condition_2>)

    2. queryset_1 & queryset_2

    3. filter(Q(<condition_1>) & Q(<condition_2>))

      多个Q()对象之间的关系Django会自动理解成“且(and)”关系

      News.objects.get(
        Q(question__startswith='Who'), Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6))
      )
      # 对应的SQL语句可以理解为:
      SELECT * from news WHERE question LIKE 'Who%'  AND (pub_date = '2005-05-02' OR pub_date = '2005-05-06')
      
  5. Django filter中使用or(Django中Q)

    filter(kwargs) //返回一个匹配查询参数的新的结果集.
    

filter(~Q(kwargs)) //返回一个不匹配查询参数的新的结果集.
exclude(kwargs) //返回一个不匹配查询参数的新的结果集.

将filter与or联系起来:
  from django.db.models import Q
  q=Q(question_startswith="What")
```
  1. 使用符号 & 或者 | 将多个Q()对象组合起来传递给filter(),exclude(),get()等函数。
    当多个Q()对象组合起来时,Django会自动生成一个新的Q():

    user.object.filter(Q(question__startswith='Who') | Q(question__startswith='What'))
    

【注意】查询表中question以‘who’或者‘what’开头的用户

```
Q(question__startswith='Who') | Q(question__startswith='What')
#这条对应的sql语句如下
WHERE question LIKE 'Who%' OR question LIKE 'What%'
```
  1. 可以在Q()对象前面使用字符“~”来表达“非”

    # 查询表中question以‘who’开头的用户或者pub_date不是2005年的数据
    Q(question__startswith='Who') | ~Q(pub_date__year=2005)
    
    # 对应SQL语句可以理解为:
    WHERE question like "Who%" OR year(pub_date) !=2005
    
  2. Q()对象可以结合关键字参数一起传递给查询函数,注意的是要将Q()对象放在关键字参数的前面

    #正确的做法                                                               
     News.objects.get(                           
       Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)),    
       question__startswith='Who')                    
                                                                            
    #错误的做法,代码将关键字参数放在了Q()对象的前面。               
     News.objects.get(                           
       question__startswith='Who',                    
       Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)))
    
  3. Q()传入条件查询

    con = Q()
    
    q1 = Q()
    q1.connector = 'OR'
    q1.children.append(('name', "cox"))
    q1.children.append(('name', "Tom"))
    q1.children.append(('name', "Jeck"))
    
    
    q2 = Q()
    q2.connector = 'OR'
    q2.children.append(('age', 12))
    
    con.add(q1, 'AND')
    con.add(q2, 'AND')
    
    models.Author.objects.filter(con) # 在Author表中,name等于cox/Tom/Jeck的 并且 满足age等于12 的所有数据
    
  4. union组合来自相同或不同模型的两个查询集:
    union运算符用于组合两个或多个查询集的结果集。
    只有具有相同字段和数据类型的查询集才能执行union操作
    查询集可以来自相同或不同的模型。
    当它们的查询集来自不同的模型时,可截取部分字段,此时字段及其数据类型应该匹配。

  5. 使用F()表达式

    每次获取times当前的值,再+1,这样需要将times值取出,存到内存中

    obj = models.Test.objects.get(name="cox")
    obj.times = obj.times + 1
    obj.save()
    obj.save() 
    obj.save() 
    obj.save()
    # 如果times的值是1,那么经过n次save()之后,times的值是2
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值