[英]Django filter models related to models in a 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
of Books
(例如,来自特定category
图书)。
books_qs = Book.objects.filter(category='World War II')
使用此QuerySet
我想查找直到给定日期的每Book
is_closed=True
最新Review
。 最简单的解决方案当然是:
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
《第二次世界大战》分类,在desired_date
之前desired_date
, is_closed
按书分类并接受最新评论的评论。
因此,我们将严格按照那些条件过滤评论。 然后,我们按book
和date_last_modified
对查询集进行排序,以便当我们在book
上使用不同的值时,它们date_last_modified
我们要在每个组中采用“第一”的字段进行排序。
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")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.