在django/sql中,是否可以通过表中的一列筛选出多个行集(每个行包含有限数量的行)?

mzmfm0qo  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(278)

对不起,这个问题太让人困惑了,我找不到更好的表达方式。用一个例子可以更好地解释这一点:
我有一个图像模型链接到一个游戏模型。每个图像都有一个类别(类别是固定的,数字大约为10)。我想得到每个类别的3张图片(或者更少,如果不够的话)。
这是当前的实施:

from django.db import models 

class Game(models.Model):
    ... 

class Image(models.Model):
    category = models.CharField()
    image = models.ImageField()
    game = models.ForeignKey(Game)

    @classmethod 
    def categories(cls):
        return ('category1', 'category2', ...)

    @classmethod 
    def get_game_images(cls, game:Game):
        return [cls.objects.filter(game=game, category=category)
                for category in cls.categories()]

# Do stuff with the images

game = Game.objects.all().first()
for category in Image.get_game_images(game):
    print(category)
    for image in category: 
        print('\t', image.image.url)

我觉得有点傻做10个非常类似的查询检索3个元素每个。。。一个简单的 Image.objects.filter(game=game).order_by('category') 很接近,但是确保每个类别只有3行变得有点复杂。有没有更好的方法来达到同样的效果?
谢谢您

lc8prwob

lc8prwob1#

您可以使用单个查询来合并某些子查询:

from django.db.models import QuerySet

# …

    @classmethod 
    def get_game_images(cls, game:Game):
        QuerySet.union(
            *[cls.objects.filter(game=game, category=category)[:3]
              for category in cls.categories()]
        )

因此,这将产生一个查询,而且 QuerySet 所以如果你不把它列举出来,就打电话给我 len(…) 它不会进行查询。
这个 [:3] 最后意味着我们最多只能拿三件东西 game 以及 category .

相关问题