Django: выбор значений из связанной таблицы

У меня есть две простые таблицы:

# Table manufacturers in my db:
# | id | name  |
# |----|-------|
# | 1  | Tesla |
# | 2  | BMW   |

# Table cars in my db:
# | id | model   | make  |
# |----|---------|-------|
# | 1  | Model 3 | Tesla |
# | 2  | M5      | BMW   |
# | 3  | Model S | Tesla |

Вот мои models.py:

from django.db import models


class ManufacturerModel(models.Model):
    id = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=255, unique=True)

    class Meta:
        managed = False
        db_table = 'manufacturers'


class CarModel(models.Model):
    id = models.IntegerField(primary_key=True)
    model = models.CharField(max_length=255)
    make = models.ForeignKey(
        ManufacturerModel,
        on_delete=models.DO_NOTHING,
        null=False,
        to_field='name',
        db_column='make'
    )

    class Meta:
        managed = False
        db_table = 'cars'

Мне нужно получить этот объект:

manufacturers = {
    'Tesla': ['Model 3', 'Model S'],
    'BMW': ['M5']
}

Или хотя бы этот:

manufacturers_1 = [
    {
        'id': 1,
        'name': 'Tesla',
        'cars': [
            {
                'id': 1,
                'model': 'Model 3',
                'make': 'Tesla'
            },
            {
                'id': 3,
                'model': 'Model S',
                'make': 'Tesla'
            }
        ]
    },
    {
        'id': 2,
        'name': 'BMW',
        'cars': [
            {
                'id': 2,
                'model': 'M5',
                'make': 'BMW'
            }
        ]
    }
]

По сути это просто очень простой запрос, и я могу легко получить все, что хочу, не создавая много кода, описывающего модели и делающего другие django вещи:

from django.db import connection
import pandas as pd


query = """
select c.model, c.make
from cars c
left join manufacturers m
    on m.name = c.make
"""
manufacturers = pd.read_sql_query(query, connection)
# ...

Но это кажется немного жестко закодированным, поэтому я пытаюсь узнать, как использовать модели Django и в чем преимущества их использования. Я потратил много времени на prefetch_related и select_related и не получил ничего полезного. Пожалуйста, помогите мне получить этот объект, используя модели Django. Заранее спасибо!

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