Выберите объекты, связанные в третьей таблице
Скажем, у меня есть модели
class A(models.Model):
class B(models.Model):
class C(models.model):
b = models.ForeignKey(B)
class D(models.Model):
c = models.ForeignKey(C)
a = models.ForeignKey(A)
Как будет выглядеть ORM-запрос для выбора всех B, связанных с C, которые связаны с определенным A через таблицу D?
OK это просто: вы должны использовать related_name в таблице C следующим образом:
class C (models.Model):
title = models.CharField(blank=True, null=True, max_length=255)
b = models.ForeignKey(B, null=True, blank=True,
on_delete=models.CASCADE, related_name='c_related')
имя_родственника: это способно обратить отношения.
Получение информации о C через таблицу B
после этого вы можете установить B Model serialzier Вот так, чтобы получить связанную с C информацию:
class B_Serilaizer(serializers.ModelSerializer):
c_related = C_Serilaizer(many=True, read_only=True)
class Meta:
model = B
fields = ('id', 'title', 'c_related')
read_only_fields = ('id',)
Сначала необходимо выбрать все Id записей таблицы C, которые связаны с определенным объектом A, из таблицы D следующим образом:
c_ids = D.objects.values_list(
'c__id', flat=True).filter(a__id="specific A object id palced here")
Наконец, вы можете получить все записи B в соответствии с таблицей C, которые связаны с конкретным объектом A следующим образом:
records = B.objects.filter(
c_related__id__in=c_ids).distinct()
финальный код:
c_ids = D.objects.values_list(
'c__id', flat=True).filter(a__id="specific A object id palced here")
records = B.objects.filter(
c_related__id__in=c_ids).distinct()
надеюсь, будет полезно.
Как упоминалось в комментарии к вашему сообщению, вы можете использовать автогенерируемое родственное имя. Но никогда не помешает задать его самостоятельно.
class C(models.model):
b = models.ForeignKey(B, related_name="c")
class D(models.Model):
c = models.ForeignKey(C, related_name="d")
a = models.ForeignKey(A, related_name="d")
Тогда:
B.objects.filter(c__d__a=specific_a_obj)