我有一张加密货币价格表:
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将表连接到自身(可能)会回答这个问题。