博客
关于我
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/

你可能感兴趣的文章
Python - 正则表达式在括号之间获取数字
查看>>
Python - 类 __hash__ 方法和集合
查看>>
Python - 轻松将文本文件内容转换为字典值/键
查看>>
Python - 递归和列表
查看>>
python -- 小数据池 is和 == 再谈编码
查看>>
Python 3 中未定义名称“xrange“
查看>>
python进阶(5):魔术方法篇(1)
查看>>
Python 3 范围与 Python 2 范围
查看>>
Python 3 读取ini文件
查看>>
Python 3.0 使用 turtle.onclick
查看>>
Python 3.10 明年发布,看看都有哪些新特性?
查看>>
python 3.10上安装pyqt5
查看>>
Python 3.12 正式发布了!
查看>>
Python 3.2 中的蛮力脚本
查看>>
Python 3.4 多处理递归 Pool.map()
查看>>
Python 3.4:未知格式代码“x“
查看>>
Python 3.5、ldap3 和 modify_password()
查看>>
python 3.6.8 升级至3.9版本升级
查看>>
Python 3.9 到 Python 3.12 的发展历程与区别
查看>>
python 32位和64位的区别在哪
查看>>