Django ORM:自己加入一张桌子

时间:2018-02-09 11:12:32

标签: python django django-orm

我有一张加密货币价格表:

id | price  | pair_id | exchange_id | date
---+--------+---------+-------------+---------------------------
 1 | 8232.7 |       1 |           1 | 2018-02-09 09:31:00.160837
 2 | 8523.8 |       1 |           2 | 2018-02-09 09:31:01.353998
 3 | 240.45 |       2 |           1 | 2018-02-09 09:31:02.524333

我想从不同的交易所获得一对货币的最新价格。在原始SQL中,我这样做:

SELECT b.price, b.date, k.price, k.date, AVG((b.price + k.price) / 2)
FROM converter_price b JOIN converter_price k 
WHERE b.exchange_id=1 AND k.exchange_id=2 AND b.pair_id=1 AND k.pair_id=1
ORDER BY b.date DESC, k.date DESC LIMIT 1;

8320.1|2018-02-09 11:23:00.369810|8318.2|2018-02-09 11:23:06.467424|8245.05199328066

如何在Django ORM中进行此类查询?

编辑:添加models.py。我知道我很可能需要更新它。

from django.db import models

# Create your models here.

class Pair(models.Model):
    identifier = models.CharField('Pair identifier', max_length=6)

    def __str__(self):
        return self.identifier


class Exchange(models.Model):
    name = models.CharField('Exchange name', max_length=20)

    def __str__(self):
        return self.name


class Price(models.Model):
    pair = models.ForeignKey(Pair, on_delete=models.CASCADE)
    exchange = models.ForeignKey(Exchange, on_delete=models.CASCADE)
    price = models.FloatField(default=0)
    date = models.DateTimeField(auto_now=True, db_index=True)

    def __str__(self):
        return '{} - {}: {} ({})'.format(
            self.date, self.pair, self.price, self.exchange)

EDIT2:澄清我真正追求的目标。

我希望最新价格为pair_id = 1且exchange_id = 1,最新价格为pair_id = 1且exchange_id = 2。使用单个查询,并且在Python中没有任何后续处理 - 当然我可以获得Price.objects.all()然后自己搜索它,但这不是使用ORM的正确方法。

使用原始SQL执行此操作的方法是将表连接到自身。显示如何使用Django ORM将表连接到自身(可能)会回答这个问题。

0 个答案:

没有答案