python - Django 过滤与 QuerySet 中的模型相关的模型
问题描述
我的应用程序中Book
有Review
模型,Review
外键字段指向Book
.
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
from datetime import datetime
class Book(models.Model):
title = models.CharField(max_length=300, null=False, blank=False)
category = models.CharField(max_length=40, blank=True)
class Review(models.Model):
reviewer = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
book = models.ForeignKey(Book, on_delete=models.CASCADE, null=False)
date_last_modified = models.DateTimeField(null=True)
is_closed = models.BooleanField(default=False)
现在,通过应用一些过滤器,我有一个(例如来自某些的书QuerySet
)。Books
category
books_qs = Book.objects.filter(category='World War II')
有了这个QuerySet
,我想为每个给定日期找到最新Review
的。最简单的解决方案当然是:is_closed=True
Book
desired_date = datetime(2018, 2, 12)
reviews = []
for book in books_qs:
try:
latest = book.review_set.filter(date_last_modified__lt=desired_date, is_closed=True).latest('date_last_modified')
except Book.DoesNotExist: # latest() throws this exception if Book has no reviews
continue
else:
reviews.append(latest)
有没有办法改进这一点以Reviews
在一个查询中获取所有内容,而不是在每个循环中多次执行Book
?
解决方案
表达您的问题的另一种方式是,您想过滤所有书籍分类为“二战”、之前修改过的评论desired_date
,并按is_closed
书籍分组并获取最新评论。
因此,我们将按照这些标准过滤我们的评论。然后我们将查询集排序book
,date_last_modified
这样当我们在 上取不同的值时book
,它们将按我们想要在每个组中取“第一个”的字段进行排序。
Review.objects.filter(
date_last_modified__lt=desired_date, is_closed=True,
book__category='World War II',
).order_by("book", "-date_last_modified").distinct("book")
推荐阅读
- c# - 使用 DB 文件在 Azure Devops 上运行测试
- c# - 在 WSL (Ubuntu) 下编译 C# 时如何告诉 Mono 为 ARM64 编译
- vue.js - Vue直接URL不起作用,只有router-link点击
- node.js - 使用 JS SDK 在 Parse Server 中查询类的权限被拒绝
- postgresql - Scala Playframework 与 Postgresql 的连接
- python - Python错误:AttributeError:'str'对象没有属性'read'
- javascript - 移动后具有类的jQuery UI可排序最近元素
- amazon-web-services - AWS:在 RDS Aurora 上启用日志记录,但 general_log 和 slow_log 表为空
- laravel - Laravel - 如何在视图中创建(匿名)动态刀片组件
- excel - 使用高级逻辑清理数据库