在两个键上加入/合并两个查询集
Posted
技术标签:
【中文标题】在两个键上加入/合并两个查询集【英文标题】:Joining/Merging two QuerySets on two keys 【发布时间】:2013-01-30 05:46:31 【问题描述】:我想在两个键上合并两个查询集。
class ModelA(models.Model)
text = models.CharField(max_length=10)
class ModelB(models.Model)
value = models.CharField(max_length=10)
model_a = models.ForeignKey(ModelA)
additionalkey = models.CharField(max_length=10)
假设我已经有一个关于所有 ModelA 对象的查询集,并且我需要来自第二个模型 (ModelB) 的相应条目,该第二个模型 (ModelB) 具有到 ModelA 的 ForeignKey-RelationShip,具体取决于附加键。实现这一目标的最快和最有效的方法是什么?
对所有条目进行循环执行此操作会针对 ModelA-QuerySet 中的每个条目访问数据库。
我的想法是一次获取所有 ModelB 对象,并将其与完整的 ModelA 集加入/合并,其中 ForeignKey 和附加键适合。
任何想法或提示任何人?
编辑:
好的,更准确地说。我已经有一个 ModelA 的查询集。毕竟我想要一个查询集,其中包含 一个查询集 中两个表的信息(或者我可以在模板中迭代的其他东西)。
【问题讨论】:
【参考方案1】:我不确定我是否理解这个问题,但也许:
ModelA.objects.all().filter(modelb__additionalkey='foo')
【讨论】:
【参考方案2】:你可以使用你modelA查询集中的pk列表来过滤modelB:
pk_list = model_a_queryset.values_list('pk', flat=True)
ModelB.objects.filter(model_a__pk__in=pk_list)
或者您可以通过使用某种值过滤 ModelB 来获得第一个查询集:
ModelB.objects.filter(model_a__title="foo")
【讨论】:
【参考方案3】:modela = ModelA.objects.filter()
modelb = ModelB.objects.filter()
......................
% for a in modela %
....
% for b in a.modelb %
....
% endfor %
% endfor %
【讨论】:
以上是关于在两个键上加入/合并两个查询集的主要内容,如果未能解决你的问题,请参考以下文章