Django ORM 查询多个关键字并通过单个查询返回多个对象列表
Django ORM Query multple keywords and retrun multiple list of of objects with single query
这些是我的模型:
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
,我正在尝试查询与english
、biology
主题相关的问题。
这是我当前的查询:
question = Question.objects.filter(
topic__name__in=["english", "biology"]
).values('title', 'id', 'topic')
它 return 是所有 biology
和 english
相关的问题。
我不想要这样。
我想要,它会return所有与english
和biology
相关的问题,但应该与组,像,所有与英语相关的对象应该在一个单独的列表和所有与生物学相关的对象应该是另一个单独的列表。
可以有很多主题,所有查询都应该在一个列表中重新运行,在该列表中,应该有多个基于主题的对象列表。
输出如下所示:
[
{
'english': [here will be all the biology related objecs in list],
'biology': [here will be all the biology related objects in list]
}
]
希望你有问题。
在这种情况下有人可以帮助我吗?
我建议反其道而行之:我们首先过滤主题,然后通过 .prefetch_related(..)
调用检索相关的 Question
:
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
}
这些是我的模型:
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
,我正在尝试查询与english
、biology
主题相关的问题。
这是我当前的查询:
question = Question.objects.filter(
topic__name__in=["english", "biology"]
).values('title', 'id', 'topic')
它 return 是所有 biology
和 english
相关的问题。
我不想要这样。
我想要,它会return所有与english
和biology
相关的问题,但应该与组,像,所有与英语相关的对象应该在一个单独的列表和所有与生物学相关的对象应该是另一个单独的列表。
可以有很多主题,所有查询都应该在一个列表中重新运行,在该列表中,应该有多个基于主题的对象列表。
输出如下所示:
[
{
'english': [here will be all the biology related objecs in list],
'biology': [here will be all the biology related objects in list]
}
]
希望你有问题。
在这种情况下有人可以帮助我吗?
我建议反其道而行之:我们首先过滤主题,然后通过 .prefetch_related(..)
调用检索相关的 Question
:
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
}