【发布时间】:2017-04-26 16:29:04
【问题描述】:
假设我有两个模型:Book 和 Author
class Author(models.Model):
name = models.CharField()
country = models.CharField()
approved = models.BooleanField()
class Book(models.Model):
title = models.CharField()
approved = models.BooleanField()
author = models.ForeignKey(Author)
这两个模型中的每一个都有一个approved 属性,用于在网站上显示或隐藏对象。如果Book 未被批准,则将其隐藏。如果Author 未通过审核,他的所有书籍都将被隐藏。
为了以 DRY 方式定义这些条件,自定义 QuerySet 看起来是一个完美的解决方案:
class AuthorQuerySet(models.query.QuerySet):
def for_site():
return self.filter(approved=True)
class BookQuerySet(models.query.QuerySet):
def for_site():
reuturn self.filter(approved=True).filter(author__approved=True)
将这些 QuerySets 连接到相应的模型后,可以像这样查询它们:Book.objects.for_site(),而无需每次都硬编码所有过滤。
尽管如此,这个解决方案仍然不完美。稍后我可以决定为作者添加另一个过滤器:
class AuthorQuerySet(models.query.QuerySet):
def for_site():
return self.filter(approved=True).exclude(country='Problematic Country')
但是这个新过滤器只能在Author.objects.for_site() 中工作,而不能在Book.objects.for_site() 中工作,因为它是硬编码的。
所以我的问题是:是否可以在过滤不同模型时应用相关模型的自定义查询集,使其看起来类似于:
class BookQuerySet(models.query.QuerySet):
def for_site():
reuturn self.filter(approved=True).filter(author__for_site=True)
其中for_site 是Author 模型的自定义查询集。
【问题讨论】:
-
我不确定这是否有帮助,但请尝试this
-
这正是我所指的将这些查询集连接到相应的模型之后。但我看不出它如何帮助使用该管理器过滤另一个相关模型的实例。也许我错过了什么?
-
你并没有错过什么,我真的认为这是一个好问题,我认为你不会找到开箱即用的东西。您可以查看docs for custom lookup 并为自己编写代码。