问题描述
当它们之间的关系不是直接的而是通过MyModelC时,如何列出每个MyModelA的MyModelB对象。
models.py
class MyModelA(models.Model):
name = models.CharField(max_length=50)
class MyModelB(models.Model):
name = models.CharField(max_length=50)
class MyModelC(models.Model):
name = models.CharField(max_length=50)
my_model_a = models.ForeignKey(MyModelA,on_delete=models.CASCADE)
my_model_b = models.ManyToManyField(MyModelB)
my_model_b_list_of_each_c_for_each_a.html
{% for a in object_list %}
{% for c in a.my_model_c_set %}
{% for b in c.my_model_b_set %} # Can I list MyModelBs of each MyModelC?
{% endfor %}
{% endfor %}
{% endfor %}
解决方法
如果只需要ModelB中的字段,则可以使用values_list:
ModelA.objects.values_list('modelC__modelB__name',flat=True)
# <QuerySet ['aaa','bbb',...] >
否则,您可以通过id在两个查询中获得模型:
ModelB.objects.filter(
id__in=ModelA.objects.values_list(
'modelC__modelB_id',flat=True
)
)
# <QuerySet [<ModelB (1)>,<ModelB(2)]>
此外,如果您希望ModelC代表具有额外数据的“多对多”,则可以使用through。