博客
关于我
Python Day17 Django 03
阅读量:804 次
发布时间: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 中的装饰器是如何工作的,有哪些实际应用场景?
查看>>
python读excel
查看>>
Python 中读取 CSV 文件-ChatGPT4o作答
查看>>
Python 之 filecmp
查看>>
python请求html_使用Python请求获取HTML?
查看>>
Python 之匿名函数和偏函数
查看>>
python 之栈的实现
查看>>
python语音播放
查看>>
python语言:装饰器原理
查看>>
Python 交互式数据可视化详解
查看>>
python语言有哪些优点和缺点_Python有哪些优缺点,你了解吗?
查看>>
Python 从入门到精通:30天速成教程到底有多狠?你能坚持下来吗?
查看>>
Python 从数据库中存储和检索密码的最安全方法
查看>>
Python语言及其应用 - 知识点遍历
查看>>
Python 优化提速的 8 个小技巧
查看>>
Python 余弦相似度与皮尔逊相关系数 计算
查看>>
python 使用execjs 报编码错误解决办法,UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xac in position 145: il
查看>>
python 使用filetype校验文件
查看>>
Python 使用flush函数将缓冲区数据立即写磁盘
查看>>