在django中将两个查询合并为一个查询



我有一个如下的模型:

class ModelA(models.Model):
id = models.CharField()
class ModelB(models.Model):
name = models.CharField()
base = models.Boolean(default=False)
modela = models.ForeignKey(ModelA)

在ModelB中,我们有以下记录:

id          name           base        modela
------------------------------------------------
1          solution_base    True        X2ZQ
2          solution_x       False       X2ZQ
3          solution_base    True        ALSB
4          solution_z       False       ALSB
5          solution_base    True        5YET
6          solution_c       False       5YET
7          solution_base    True        PIAT
...        ...              ...         ...

正如您所看到的,每个记录都有一个自己的基本副本,可以通过唯一的模型(外键(来区分。我所需要的是,通过给定的正常解决方案id(例如solution_x(,我需要查询其基本等价的基本对象(其中modela-id相同(。到目前为止我做了什么:

modela_id = ModelB.objects.filter(id=modelb_pk).select_related('modela_id').values_list('modela_id', flat=True)
modelb_solution_base_id = ModelB.objects.filter(modela_id=modela_id[0]).filter(base=True).select_related('modela_id').values_list('id', flat=True)

我想应该有一个使用prefetch_related(Prefetch())合并这两者的解决方案,但我不知道如何使用它。如有任何帮助,我们将不胜感激。

我认为这比必要的要复杂一些——由于外键关系,Django ORM为您处理了大部分问题。给定ModelB的ID,具有相同ModelA但base=True的其他ModelB的ID:

ModelB.objects.get(id=modelb_pk).modela.modelb_set.get(base=True).id

为什么这样做?

  1. 因为ModelB与ModelA有多对一的关系,我们可以在ModelB的实例上调用.modela来获得相应的ModelA
  2. 相反,给定一个ModelA实例,调用.modelb_set将返回与ModelA关联的所有ModelB记录
  3. 然后,我们可以在modelb_set上调用.get/.filter,就像使用ModelB.objects一样

相关内容

  • 没有找到相关文章

最新更新