Q() 函数的作用
在Django中,Q()函数是一个非常有用的工具,主要用于构建复杂的查询。它允许你创建复杂的查询语句,包括AND、OR和NOT逻辑操作。这对于处理复杂的数据库查询特别有用,特别是在你需要组合多个条件或处理复杂的过滤逻辑时。
Q对象允许你使用关键字参数或Q对象的组合来构建查询。Q对象可以被链接在一起,使用
&
表示AND,
|
表示OR,
~
表示NOT。
示例
1,添加模型
Test/app11/models.py
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
pub_date = models.DateTimeField('date published')
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.CharField(max_length=100)
publication_date = models.DateField()
price = models.DecimalField(max_digits=5, decimal_places=2)
def __str__(self):
return self.title
2,添加视图函数
- 查询所有标题包含"Python"的书籍。
- 查询所有作者为"John Doe"的书籍。
- 查询所有在2020年之后出版的书籍。
- 查询所有价格在20到30之间的书籍。
- 查询所有标题包含"Python"或作者为"John Doe"的书籍。
- 查询所有标题包含"Python"且价格在20到30之间的书籍。
- 查询所有不在2020年出版的书籍。
Test/app11/views.py
from django.shortcuts import render
from django.db.models import Q
def book_list_Q(request):
# 1. 查询所有标题包含"Python"的书籍
# books = Book.objects.filter(Q(title__icontains='Python'))
# 2. 查询所有作者为"John Doe"的书籍
# books = Book.objects.filter(Q(author='John Doe'))
# 3. 查询所有在2020年之后出版的书籍
# books = Book.objects.filter(Q(publication_date__year__gt=2020))
# 4. 查询所有价格在20到30之间的书籍
# books = Book.objects.filter(Q(price__gte=20) & Q(price__lte=30))
# 5. 查询所有标题包含"Python"或作者为"John Doe"的书籍
# books = Book.objects.filter(Q(title__icontains='Python') | Q(author='John Doe'))
# 6. 查询所有标题包含"Python"且价格在20到30之间的书籍
# books = Book.objects.filter(Q(title__icontains='Python') & Q(price__gte=20) & Q(price__lte=30))
# 7. 查询所有不在2020年出版的书籍
books = Book.objects.filter(~Q(publication_date__year=2020))
return render(request, '11/book_list.html', {'books': books})
3,添加html代码
Test/templates/11/book_list.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Book List</title>
</head>
<body>
<h1>List of Books</h1>
{% if books %}
<ul>
{% for book in books %}
<li>
<strong>Title:</strong> {{ book.title }}<br>
<strong>Author:</strong> {{ book.author }}<br>
<strong>Publication Date:</strong> {{ book.publication_date }}<br>
<strong>Price:</strong> {{ book.price }}<br>
</li>
{% endfor %}
</ul>
{% else %}
<p>No books found.</p>
{% endif %}
</body>
</html>
4,添加路由地址
Test/app11/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('book_list_Q/', views.book_list_Q, name='book_list_Q'),
]