Показать статистику
0 голосов
от (2.7тыс. баллов)

Есть две таблицы Товары и История цен Необходимо вывести последнюю цену по дате из таблицы истории цен. Это будет работать на Sqlite, но я не могу понять, как это сделать через Queryset

SELECT name,max(date),price,price_discount FROM polls_products
INNER JOIN polls_history_price on polls_history_price.product_id = polls_products.id
GROUP BY polls_products.id


class Products(models.Model):
    id = models.IntegerField(primary_key=True, blank=True)
    name = models.CharField(max_length=250)
    date_create = models.DateTimeField('Event Date')

class HistoryPrice(models.Model):
    product = models.ForeignKey(Products, null=True, on_delete=models.PROTECT, related_name='price_list')
    date = models.DateTimeField('Event Date')
    price = models.FloatField(blank=True,)
    price_discount = models.FloatField(blank=False)

пытаясь получить так

Products.objects.prefetch_related('price_list').values('name','price_list__product_id').annotate(price_date=Max('price_list__date'))

нужно только добавить поле "цена"

252 просмотров 1 ответов

1 Ответ

0 голосов
от (26.4тыс. баллов)

Если вы хотите получить QuerySet, вы можете получить объекты только одной модели. Но вы можете легко получить доступ к нужным вам значениям. Чтобы получить последние сведения HistoryPrice (по дате, а не по идентификатору), вы можете добавить в  модель Products простую функцию:

class Products(models.Model):
    ...

    def get_latest_history_price(self):
        return self.price_list.order_by('date').last()    # get object

    def get_latest_history_price_price(self):
        return self.price_list.order_by('date').last().price   # get price

Это поможет вам легко получить объект HistoryPrice для текущего Products объекта, например:

products = Products.objects.first()           # get an object of Products model
price = products.get_latest_history_price()   # get the newest related HistoryPrice object
price.price                                   # get price field value of HistoryPrice object
price.price_discount                          # get price_discount field value of HistoryPrice object
...