博客
关于我
Python Day17 Django 03
阅读量:798 次
发布时间:2023-03-05

本文共 2492 字,大约阅读时间需要 8 分钟。

Django ORM 基础教程:模型与查询

一、模型定义

Book 模型

class Book(models.Model):    title = models.CharField(max_length=32)    price = models.DecimalField(max_digits=6, decimal_places=2)    create_time = models.DateField()    memo = models.CharField(max_length=32, default="")    publish = models.ForeignKey(to="Publish", default=1)    author = models.ManyToManyField("Author")    def __str__(self):        return self.title

Publish 模型

class Publish(models.Model):    name = models.CharField(max_length=32)    email = models.CharField(max_length=32)

Author 模型

class Author(models.Model):    name = models.CharField(max_length=32)    def __str__(self):        return self.name

二、跨表查询

一对多关系

正向查询

# 查询id=1的书籍的出版社名称book_obj = Book.objects.filter(id=6).first()print(book_obj.publish.name)

反向查询

# 查询苹果出版社出版了哪些书publish_obj = Publish.objects.filter(name='图灵新知').first()print(publish_obj.book_set.all())# 输出结果示例:# 
,
]

多对多关系

正向查询

# 查询所有作者的名字book_obj = Book.objects.filter(title='go').first()author_obj = book_obj.author.all()for author in author_obj:    print(author.name)

反向查询

# 查询alex出版过的所有书籍名称author_obj = Author.objects.filter(name="alex").first()book_obj = author_obj.book_set.all()for book in book_obj:    print(book.title)

一对一关系

正向查询

# 查询alex的手机号obj = Author.objects.filter(name="alex").first()print(obj.authordetail.tel)

反向查询

# 查询手机号为456的作者的名字obj = AuthorDetail.objects.filter(tel=456).first()print(obj.author.name)

三、聚合与分组

聚合查询

使用aggregate方法来进行统计:

# 统计所有书籍的平均价格ret = Book.objects.all().aggregate(Avg("price"))print(ret)  # 输出示例:{'price__avg': 416}

分组查询

使用annotate方法来进行分组:

# 查询每个出版社出版的书籍个数ret = Publish.objects.all().annotate(c=Count("book")).values("name", "c")print(ret)# 输出结果示例:# 

四、F查询与Q查询

F查询

用于比较同一实例中的两个字段:

# 查询评论数大于点赞数的书籍ret = Book.objects.filter(comment_num__gt=F("poll_num")).all()print(ret)

Q查询

用于构建更复杂的查询条件:

# 查询以java开头或价格大于200的书籍ret = Book.objects.filter(    Q(title__startswith="java") | Q(price__gt=200)).all()print(ret)

五、AJAX 交互

用户名检查

POST 请求

跳转新页面

六、Cookie

设置与获取

# 获取Cookieret = request.COOKIES.get("is_login_dzm")# 设置Cookieresponse = HttpResponse(json.dumps(res))response.set_cookie("is_login_dzm", True)
  • key:键
  • value:值
  • max_age:有效时间,单位秒
  • expires:有效时间节点
  • path:路径
  • domain:域名
  • secure:HTTPS传输
  • httponly:仅通过HTTP传输
import datetimeresponse.set_cookie("username", user.name, expires=datetime.datetime.strptime("2024-01-01 00:00:00", "%Y-%m-%d %H:%M:%S"))

七、总结

通过本文,您学会了如何在 Django 中使用 ORM 进行跨表查询、聚合与分组操作,以及如何实现 AJAX 交互和 Cookie 的使用。这些技术是 Django Web 开发中的核心技能,能够帮助您高效地构建和管理数据库应用。

转载地址:http://ctafk.baihongyu.com/

你可能感兴趣的文章
protobuf对象与JSON相互转换
查看>>
ProtoBuf的介绍以及在Java中使用protobuf将对象进行序列化与反序列化
查看>>
protocol学习笔记001---RPC和HTTP协议之间的区别_与各自优势
查看>>
protostuff简单应用
查看>>
Proxy源代码分析--谈谈如何学习linux网络编程
查看>>
pr录制自己声音杂音很重
查看>>
ps ww
查看>>
PS —— 制作喷漆人像
查看>>
PS —— 制作证件照
查看>>
PS —— 精修图像
查看>>
PS 图像调整算法——色调分离
查看>>
ps 图层混合模式
查看>>
PS获取RGB和十六进制的颜色值
查看>>
PyTorch 的 10 条顶级知识点
查看>>
PS辅助工具Assistor PS
查看>>
pt-archiver 归档历史数据及参数详解
查看>>
pt-online-schema-change使用详解
查看>>
PyTorch 模型性能分析和优化 — 第 2 部分
查看>>
PTA L1-011 A-B
查看>>
pta l2-1紧急救援(Dijkstra)
查看>>