博客
关于我
Python Day17 Django 03
阅读量:800 次
发布时间: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/

你可能感兴趣的文章
pytest 的 request fixture:实现个性化测试需求
查看>>
Pytest+Allure 接口自动化测试平台开发实战
查看>>
pytest+allure使用动态级别,参数化severity
查看>>
Pytest+Unittest+Git+Jenkins企业级CICD自动化测试平台建设方案
查看>>
Pytest+Yaml 数据驱动测试用例
查看>>
pytest-base-url插件之配置可选的项目系统URL
查看>>
pytest-xdist 进行多进程并发测试!
查看>>
pytest-xdist:远程多主机 - 分布式运行自动化测试
查看>>
Pytest中进行测试环境切换:pytest_addoption!
查看>>
pytest利用request fixture实现个性化测试需求详解
查看>>
pytest单元测试实战
查看>>
pytest单元测试框架
查看>>
Pytest参数详解 — 基于命令行模式
查看>>
pytorch cv2 plt transforms pause waitforbuttonpress一个完整的图片处理程序
查看>>
pytest学习和使用 - Pytest用例执行结果有哪几种状态?
查看>>
pytest实战技巧之参数化应用!
查看>>
Pytest实践:Python测试技术基础知识!
查看>>
Pytest数据驱动怎么玩?实战教程来了!
查看>>
Pytest框架 之【用例执行顺序】
查看>>
Pytest框架中的测试用例执行方式!
查看>>