我有一个如下的模型:
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
为什么这样做?
- 因为ModelB与ModelA有多对一的关系,我们可以在ModelB的实例上调用
.modela
来获得相应的ModelA - 相反,给定一个ModelA实例,调用
.modelb_set
将返回与ModelA关联的所有ModelB记录 - 然后,我们可以在
modelb_set
上调用.get
/.filter
,就像使用ModelB.objects
一样