Django查询笔记1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
models.Book.objects.filter(**kwargs):   querySet   [obj1,obj2]
models.Book.objects.filter(**kwargs).values(**kwargs)       :  querySet  [{},{},{}]
models.Book.objects.filter(**kwargs).values_list(title)  :  querySet  [(),(),()]
 
跨表查询总结:
    class Book(models.Model):
        title = models.CharField(max_length=32)
        publish=models.ForeignKey("Publish")          # 创建一对多的外键字段
        authorList=models.ManyToManyField("Author")   # 多对多的关系,自动创建关系表
   
    class Publish(models.Model):
        name = models.CharField(max_length=32)
        addr = models.CharField(max_length=32)
            
    class Author(models.Model):
        name=models.CharField(max_length=32)
        age=models.IntegerField()
        ad=models.models.OneToOneField("AuthorDetail")
     
    class AuthorDetail(models.Model):
        tel=models.IntegerField()
 
基于对象关联查询:      
    if 一对多查询(Book--Publish):
          正向查询,按字段:
          book_obj.publish   :  与这本书关联的出版社对象    book_obj.publish.addr: 与这本书关联的出版社的地址
          反向查询,按表名_set
          publish_obj.book_set: 与这个出版社关联的书籍对象集合 publish_obj.book_set.all() :[obj1,obj2,....]   
     
    if 一对一查询(Author---AuthorDetail):
          正向查询,按字段:
          author_obj.ad : 与这个作者关联的作者详细信息对象
           
          反向查询:按表名:
          author_detail_obj.author  : 与这个作者详细对象关联的作者对象
           
    if  多对多(Book----Author):
     
        正向查询,按字段:      
        book_obj.authorList.all(): 与这本书关联的所有这作者对象的集合  [obj1,obj2,....]
         
        反向查询,按表名_set:
        author_obj.book_set.all() : 与这个作者关联的所有书籍对象的集合
 
基于双下滑线的跨表查询:
 
    if 一对多查询(Book--Publish):
     
        正向查询,按字段:      
        # 查询linux这本书的出版社的名字:
        models.Book.objects.all().filter(title="linux").values("publish__name")
         
        反向查询:按表名:
        # 查询人民出版社出版过的所有书籍的名字
        models.Publish.objects.filter(name="人民出版社出版").values("book__title")
         
    if 一对一查询(Author---AuthorDetail):
     
        正向查询,按字段:
        models.Author.objects.filter(name="egon).values("ad__tel")
         
        反向查询:按表名:
        models.AuthorDetail.objects.filter(tel="151").values("author__name")
         
    if  多对多(Book----Author):
     
        正向查询,按字段:
        models.Book.objects.filter(title="python").values("authorList__name")     [{},{},{},{}]
         
        正向查询,按表名:
        models.Author.objects.filter(name="alex").values("book__price")
         
注意:
 
    publish=models.ForeignKey("Publish",related_name="bookList")
    authorlist=models.ManyToManyField("Author",related_name="bookList")
    ad=models.models.OneToOneField("AuthorDetail",related_name="authorInfo")
 
    反向查询的时候都用:related_name
  
    聚合查询:
        querySet().aggregate(聚合函数)------返回的是一个字典,不再是一个querySet
      
        Book.objects.all().aggregate(average_price=Avg('price'))
     
  
分组查询:
    querySet().annotate() --- 返回的是querySet
    #统计每一个出版社中最便宜的书籍的价格
    sql:
       select Min(price) from book group by publish_id;
     
    ORM:
    models.Book.objects.values("publish__name").annotate(Min("price"))
     
F查询 与 Q查询
    F()查询
    Django提供的F()来做两个字段的比较;
    Django支持F()对象之间以及 F()对象和常熟之间的加减乘除和取模操作;
    修改操作也可以使用F函数,比如将每一本书的价格提高7元;
     
    Q()查询
    filter()等方法中的关键字参数查询都是期进行“AND”的,。如果你需要执行更加复杂的查询(例如or语句),你可以使用Q对象。
    Q对象可以使用& 和| 操作符组合起来,当一个操作符在两个Q之间使用的时候,他会产生一个新的Q对象
 
http无法保存状态:此时cookie就诞生了<br>cookie:客户端浏览器保存的一组组的键值对:-------{"":"","":"","":""}<br>但是cookie的所有信息都在浏览器是上边了,这样很不安全,<br>此时cookie+session就诞生了:<br>session:服务器上保存的用户信息

浏览器(一段代码展示,其实金和cookie差不多):

url: http://127.0.0.1:8000/login/ get 
url: http://127.0.0.1:8000/login/ post user pwd

url: http://127.0.0.1:8000/home/

{"sessionID":"dfhasdjfhkjlcn4352kjdsfhkjsd"}

if post:

requset.session["IS_LOGON"]=True
requset.session["USER"]=username

return redirect("/home/")

Django: 
1 s="sdgsdfg4565dfgsdfgsdf" 
2 在django-session表中,添加一条记录
insert into django-session values (s,"{"IS_LOGON":True,"USER":egon}",12321)
3 obj.set_cookie("sessionID",s) {"sessionID":"sdgsdfg4565dfgsdfgsdf"} sdgsdfg4565dfgsdfgsdf:{d}

重定向:

/home/ ----> {"sessionID":"fasdlkfjsakdl324ada2adhdjlka99"}

request.session.get("IS_LOGON",None)

在django-session表中,进行查询:
s=requset.COOKIE.get("sessionID")
select session-data from django-session where session-key=s


 

posted @   一石数字欠我15w!!!  阅读(401)  评论(0编辑  收藏  举报
编辑推荐:
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
点击右上角即可分享
微信分享提示