我有一个关于为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_date
和manager_id
领域在建立模型方面让我最困惑。字段trade_date
位于以下两个表position
和price
上。同样,manager_id
字段位于以下三个表manager
,position
和portfolio
上。
所有表均正确使用外键,如上面的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'
选项。两个表position
和price
的许多记录都具有相同的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)。谢谢。