在Django中组合Q对象并限制其中之一

Posted

技术标签:

【中文标题】在Django中组合Q对象并限制其中之一【英文标题】:Combine Q objects in Django and limit one of them 【发布时间】:2014-10-11 18:49:01 【问题描述】:

我想将这 2 个查询合并为 1 以获取名称为 xyzMusic 对象,并从流派 10 中获取前 3 个对象,按艺术家排序:

1. Music.objects.filter(name='xyz', genre=10)

2. Music.objects.filter(genre=10).order_by('artist')[:3]

我可以像这样使用Q 对象,但我不知道如何排序和过滤下面的第三个Q 对象:

Music.objects.filter( (Q(name='xyz') & Q(genre=10)) | Q(genre=10) )

【问题讨论】:

【参考方案1】:

也许可以这样试试?

Music.objects.filter( (Q(name='xyz') & Q(genre=10)) | Q(genre=10) ).order_by('artist')[:3]

【讨论】:

这是不正确的。我想要名称为 xyz + 前 3 的对象。这只会获得前 3 名。它不能确保结果具有名称为 xyz 的对象 这在逻辑上等价于Music.objects.filter( Q(name='xyz') | Q(genre=10) ).order_by('artist')[:3] 还有@click,现在有办法做到这一点。您想要来自两个不同查询的四个结果,为什么要使用单个查询?【参考方案2】:

没办法,使用两个查询,但更改第二个以避免重复:

exact = Music.objects.filter(name='xyz', genre=10)
additional = Music.objects.filter(genre=10).exclude(name='xyz').order_by('artist')[:3]
do_something_with = list(exact) + list(additional)

【讨论】:

以上是关于在Django中组合Q对象并限制其中之一的主要内容,如果未能解决你的问题,请参考以下文章

Django 文件上传大小限制

使用 Q-Objects 在 Django 中动态构建复杂查询

Django - 将列表转换为 Q 对象的组合 OR 的正确方法 [重复]

如何限制 django 网站的 redis/celery 任务?

Typescript 对象:如何将键限制为特定字符串?

无法限制 ComboBox 控件的垂直大小