【发布时间】:2015-12-29 13:34:19
【问题描述】:
是否可以测试单个模型实例是否满足 Q 对象的条件?
那么,有没有像is_q_satisified这样的功能:
article = Article.objects.filter(title='Foo')[0]
q = Q(title='Foo')
assert is_q_satisfied(q, article)
【问题讨论】:
是否可以测试单个模型实例是否满足 Q 对象的条件?
那么,有没有像is_q_satisified这样的功能:
article = Article.objects.filter(title='Foo')[0]
q = Q(title='Foo')
assert is_q_satisfied(q, article)
【问题讨论】:
没有内置的is_q_satisified,但您可以自己制作一个,通过过滤 q 和对象的主键。
# Note I've used get() to return an object,
# instead of filter(), which returns a queryset.
article = Article.objects.get(title='Foo')
def is_q_satisfied(obj, q):
return type(obj).objects.filter(q).filter(pk=obj.pk).exists()
q = Q(title='Foo')
is_q_satisfied(article, q)
【讨论】:
exists() 调用会导致调用数据库吗?
Q(title='Foo').children返回列表[('title', 'foo')],你可以检查getattr(obj, 'title') == 'Foo',但是代码会变得更复杂,因为可以组合Q对象,你可以得到像Q(category__title='Bar')这样的查找。
Q(published=False),但还有其他需要数据库查找的,例如Q(author__name='Ali'),正在过滤相关模型。