Как объединить две модели с разными именами столбцов и вернуть все экземпляры?
Я хочу создать кадр данных о 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-соединении.