带有多个联接的django模型

时间:2018-10-13 19:21:34

标签: python django manytomanyfield

我有一个关于为Postgres View创建Django模型的问题。我的视图在数据库中创建,它在多个表上使用联接。这是我的看法:

select cp.trade_date, ins.symbol, mgr.username, pt.strategy, pt.substrategy, 
pos.quantity, cp.price
from position pos
join manager mgr
  on pos.manager_id = mgr.id
join instrument ins
  on pos.instrument_id = ins.id
join price cp
  on cp.instrument_id = ins.id and cp.trade_date = pos.trade_date
join portfolio pt
  on pt.manager_id = mgr.id and pos.portfolio_id = pt.id

在其他领域中,我相信trade_datemanager_id领域在建立模型方面让我最困惑。字段trade_date位于以下两个表positionprice上。同样,manager_id字段位于以下三个表managerpositionportfolio上。

所有表均正确使用外键,如上面的JOIN语句所述(我的模型与数据库表共享一个名称)。 (编辑:现在显示我的models.py

class Instrument(models.Model):
    symbol = models.CharField(max_length=100, unique=True)
    cusip = models.CharField(max_length=9)
    mktArea = models.CharField(max_length=100)
    currency = models.CharField(max_length=3)
    active_date = models.DateTimeField('Active Date')
    last_modified = models.DateTimeField(auto_now=True)

class Manager(models.Model):
    email = models.CharField(max_length=200)
    first_name = models.CharField(max_length=200)
    last_name = models.CharField(max_length=200)
    username = models.CharField(max_length=200, unique=True)

class Portfolio(models.Model):
    manager = models.ForeignKey(
        Manager, to_field='id', on_delete=models.CASCADE)
    strategy = models.CharField(max_length=200, unique=True)
    substrategy = models.CharField(max_length=200)

class Price(models.Model):
    instrument = models.ForeignKey(
        Instrument, to_field='id', on_delete=models.CASCADE)
    price = models.FloatField()
    trade_date = models.DateField(default=datetime.date.today)

class Position(models.Model):
    manager = models.ForeignKey(
        Manager, to_field='id', on_delete=models.CASCADE)
    instrument = models.ForeignKey(
        Instrument, to_field='id', on_delete=models.CASCADE)
    portfolio = models.ForeignKey(
        Portfolio, to_field='id', on_delete=models.CASCADE)
    trade_date = models.DateField(default=datetime.date.today)
    quantity = models.IntegerField(default=0)

这是我如何绘制视图模型(以获取trade_date字段)的方式,但是ManyToManyField没有'to_field'选项。两个表positionprice的许多记录都具有相同的trade_date。我已经读过through参数,但我认为这不是我需要使用的。任何帮助都将不胜感激。

class Vw_Positions(models.Model):
    trade_date = models.ManyToManyField(Position, Price, to_field='trade_date')

    class Meta:
        managed = False

我注意到django-postgres库,但是它似乎没有被广泛使用。 (我正在使用Docker和Django 2.1,Python 3.6)。谢谢。

0 个答案:

没有答案