【问题标题】:django efficient way to combine 2 queries or make a compound one?django 组合 2 个查询或复合查询的有效方法?
【发布时间】:2013-05-11 00:58:23
【问题描述】:

我的(简化的)模型是这样的:

class Story(models.Model):
    wikiedit = models.BooleanField(default=False)
    writers = models.ManyToManyField(User,null=True,blank=True)
class Writer(models.Model):
    user = models.OneToOneField(User)

现在我正在尝试构建一个查询集,其中包含所有满足的故事:wikiedit = True or user in writers

所以在我看来,我做了两个查询:

wikistories = Story.objects.filter(wikiedit=True)
writerstories = request.user.objects.story_set.filter

但如果可能的话,我想只用一个数据库命中来完成它。我想这会更有效率。从某种意义上说,我无法找到这种 m2m 关系中是否支持 in 运算符:

 Story.objects.filter(writers__contains=request.user) #but this is a TypeError

也许创建 2 个查询集然后将它们加入到一个列表中会更有效,但我希望将其合并到一个列表中。

有什么线索吗?谢谢!

【问题讨论】:

    标签: django django-queryset django-orm


    【解决方案1】:

    要检查 M2M 关系,您只需使用 =,而不是 contains

    Story.objects.filter(writers=request.user)
    

    您可以使用Q 对象进行or 查询:

    Story.objects.filter(Q(wikiedit=True) | Q(writers=request.user))
    

    【讨论】:

    • 太棒了!它有效,可能是一个太基本的问题,但我几个小时都没有找到这个信息!只是给更多读者的注释,这可能包括重复的结果,它们可能被排除在外:Story.objects.filter( qwriters | (qwiki & ~qwriters)) 其中 qwriters 和 qwiki 是相应的 Q 对象。谢谢!
    猜你喜欢
    • 2018-08-02
    • 1970-01-01
    • 2020-04-27
    • 2016-06-17
    • 2022-11-08
    • 1970-01-01
    • 2019-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多