Django ORM查询多个关键字并通过单个查询重新运行多个对象列表

问题描述 投票:2回答:1

这些是我的模特:

class Topic(models.Model):
    name = models.CharField(
        max_length=50
    )


class Question(models.Model):
    title = models.CharField(
        max_length=100
    )
    topic = models.ForeignKey(
        Topic,
        on_delete=models.CASCADE
    )

例如,我对来自许多主题的topic有很多疑问,我正在尝试查询与主题相关的englishbiology问题。

这是我当前的查询:

question = Question.objects.filter(
        topic__name__in=["english", "biology"]
    ).values('title', 'id', 'topic')

它返回所有与biologyenglish相关的问题。

我不想要这样。

[我想要,它将返回所有与englishbiology相关的问题,但应与小组同在的问题,例如,所有与英语相关的对象应在单独的列表中,而所有与生物学相关的对象应在另一个列表中单独的列表。

可能有很多主题,所有查询应在一个列表中重新运行,并且在该列表中,应基于该主题有多个对象列表。

输出看起来像这样:

[
    {
        'english': [here will be all the biology related objecs in list],
        'biology': [here will be all the biology related objects in list]
    }
]

希望您有问题。

在这种情况下有人可以帮助我吗?

django django-models django-orm
1个回答
0
投票

我建议采取另一种方法:我们首先对主题进行过滤,然后通过Question调用检索相关的.prefetch_related(..)

qs = Topic.objects.filter(
    name__in=['english', 'biology']
).prefetch_related('question')

然后我们可以使用以下命令构建字典:

result = {
    t.name: [{'id': q.id, 'title': q.title} for q in t.question_set.all()]
    for t in qs
}
© www.soinside.com 2019 - 2024. All rights reserved.