Выберите объекты, связанные в третьей таблице

Скажем, у меня есть модели

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)

Вернуться на верх