【发布时间】:2016-11-23 01:25:10
【问题描述】:
我的主要问题是:有什么方法可以改变相关查找的行为,例如MyModel.objects.filter(relationship__field="value")?
考虑这种设置。我与自定义管理器建立了一对多关系,该管理器过滤掉带有active=False的书籍
from django.db import models
class ActiveOnly(models.Manager):
use_for_related_fields = True
def get_queryset(self):
return super(ActiveOnly, self).get_queryset().filter(active=True)
class Author(models.Model):
name = models.TextField()
class Book(models.Model):
active = models.BooleanField()
author = models.ForeignKey(Author, related_name="books")
title = models.TextField()
objects = ActiveOnly()
让我们创建一些数据:
jim = Author.objects.create(name="Jim")
ulysses = Book.objects.create(title="Ulysses", author=jim, active=True)
finnegans = Book.objects.create(title="Finnegan's Wake", author=jim, active=False)
bill = Author.objects.create(name="Bill")
hamlet = Book.objects.create(title="Hamlet", author=bill, active=False)
基本上,我永远不想处理不活跃的书籍。以下是一些用于测试各种场景的查询。
>>> Book.objects.all().count() # expecting the 1 active book: good
1
>>> jim.books.all() # also expecting only 1: good
1
>>> Author.objects.filter(books__title="Hamlet").first().name
u'Bill'
# ^ this is what I don't want to see, because bill's only book has active=False.
# I want the queryset to return no results.
是否有任何方法来更改books__* 查找的行为以包括active 上的附加过滤器?
【问题讨论】:
-
如果您不提供完整的详细信息,我不知道您如何期望得到好的答案
-
我本来很仓促的写了一天的问题,我现在更新了例子。
-
你说的 date_deleted 在哪里?
-
@e4c5,在我正在处理的实际代码中,我使用的是
date_deleted字段。您在对答案的评论中提出的观点是,对可索引字段进行过滤比在不可索引的 BooleanField 上过滤更有效,但我希望这个示例尽可能简单,所以我选择了 BooleanField。为了看看它是否真的有效,它没有任何区别。
标签: python sql django django-models django-orm