首页 > 解决方案 > Django ORM查询多个关键字并使用单个查询重新运行多个对象列表

问题描述

这些是我的模型:

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')

它返回所有相关的biology问题english

我不想要完全这样。

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

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

输出如下所示:

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

我希望你有问题。

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

标签: djangodjango-modelsdjango-orm

解决方案


我建议反过来:我们首先过滤主题,然后Question通过调用检索相关的 s .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
}

推荐阅读