繁体   English   中英

与QuerySet中的模型相关的Django过滤器模型

[英]Django filter models related to models in a QuerySet

我的应用程序中有BookReview模型, 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_dateis_closed按书分类并接受最新评论的评论。

因此,我们将严格按照那些条件过滤评论。 然后,我们按bookdate_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM