Как объединить две модели с разными именами столбцов и вернуть все экземпляры?

Я хочу создать кадр данных о 3 самых продаваемых меню_пунктах в моей таблице Purchases. Я думаю создать соединение модели Purchases с моделью Menu_Item, где Purchases.menu_item = Menu_Item.title. Я преобразую QuerySet в DataFrame с помощью django_pandas.io. Я планирую использовать сумму Menu_Item.price, связанную с каждым отдельным Purchases.menu_item для определения Топ-3 меню_элементов из всех записей в таблице Purchases. Моя проблема в том, что я не могу успешно соединить эти две таблицы. Я перерыл весь интернет в поисках рабочего решения для объединения двух моделей с разными именами полей, которое возвращает все экземпляры, и я пробовал различные решения, но скудные статьи на эту тему не принесли никакой радости.

models.py

...
class MenuItem(models.Model):
    title = models.CharField(max_length=100, unique=True,
                             verbose_name="Item Name")
    price = models.FloatField(default=0.00, verbose_name="Price")
    description = models.CharField(max_length=500,
                                   verbose_name="Item Description")
    def __str__(self):
        return f"title={self.title}; price={self.price}"

    def get_absolute_url(self):
        return "/menu"

    def available(self):
        return all(X.enough() for X in self.reciperequirement_set.all())

    class Meta:
        ordering = ["title"]


class Purchase(models.Model):

    menu_item = models.ForeignKey(MenuItem, on_delete=models.CASCADE,
                                  verbose_name="Menu Item")
    timestamp = models.DateTimeField(auto_now_add=True,
                                     verbose_name="DateTime")

    def __str__(self):
        return f"menu_item=[{self.menu_item.__str__()}]; time={self.timestamp}"

    def get_absolute_url(self):
        return "/purchases"

    class Meta:
        ordering = ["menu_item"]

Я пытался адаптировать слишком много неудачных фрагментов кода, чтобы воспроизвести их здесь, поэтому я хочу начать с чистого листа. Я надеюсь, что у вас есть эффективное решение, которым вы можете поделиться. Ваша помощь будет высоко оценена. Спасибо.

Вы не упомянули, что вы уже пробовали, поэтому мне (и другим разработчикам) трудно дать точные рекомендации.

В любом случае, пробовали ли вы что-то вроде

purchases = Purchase.objects.values(
    'timestamp', 
    item_title=F('menu_item__title'), 
    item_price=F('menu_item__price'),
    item_desc=F('menu_item__description'))

Этот набор запросов получит все значения в одном sql-соединении.

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