Модели Django - отношения между братьями и сестрами через ребенка

Как я могу перечислить объекты MyModelB для каждой MyModelA, если их отношения не прямые, а через MyModelC.

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 %}

person Necip Muzaffer    schedule 20.10.2020    source источник
comment
что вы имеете в виду, все mymodelb для mymodel a, они не связаны, почему у них есть какие-либо коррелированные списки, кажется, вы что-то смоделировали не так. Напишите некоторые дополнительные сведения, например образцы данных, а не в комментариях, а отредактируйте сообщение   -  person iklinac    schedule 20.10.2020
comment
Почему бы просто не отредактировать вопрос и не добавить его вместо добавления комментария с извинениями.   -  person Underoos    schedule 20.10.2020
comment
У меня 3 модели (A, B и C). A и B - братья и сестры. У C есть ForeignKey для A и поле ManyToMany для B. Мой вопрос: учитывая список A, могу ли я пройти через B, который не имеет прямого отношения к A? Могу ли я перечислить B каждого пункта от A до C?   -  person Necip Muzaffer    schedule 22.10.2020


Ответы (1)


Если вам просто нужны поля из вашей ModelB, вы можете использовать values_list:

ModelA.objects.values_list('modelC__modelB__name', flat=True)
# <QuerySet ['aaa', 'bbb', ...] >

в противном случае вы можете получить свои модели в двух запросах через идентификаторы:

ModelB.objects.filter(
    id__in=ModelA.objects.values_list(
        'modelC__modelB_id',
         flat=True
    )
)
# <QuerySet [<ModelB (1)>, <ModelB(2)]>

Кроме того, если вы хотите, чтобы ваш ModelC представлял «многие ко многим» с дополнительными данными, вы можете использовать через.

person Taek    schedule 20.10.2020