【问题标题】:Test Q objects against model instance针对模型实例测试 Q 对象
【发布时间】: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)

【问题讨论】:

    标签: django django-q


    【解决方案1】:

    没有内置的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 对象测试模型实例?通过解析 Q 对象的内容并将其转换为模型实例上的相关断言是可能的,但这将是重新发明轮子 IMO!
    • @AliShamakhi 可以在 Python 中测试一些断言,例如Q(published=False),但还有其他需要数据库查找的,例如Q(author__name='Ali'),正在过滤相关模型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    • 1970-01-01
    • 2014-09-25
    相关资源
    最近更新 更多