Django:强制多对多的唯一性'通过'字段

时间:2017-12-02 08:49:03

标签: django database django-models

我正在尝试为股票投资组合设计数据库架构。到目前为止,我似乎只使用了一个警告 - 投资组合可以包含两个相同股票的持股。我希望投资组合中的股票具有独特的持股。我是Django的新手,并且无法解决这个问题。

class Stock(models.Model):
    """
    All available stocks
    """
    symbol = models.CharField(primary_key=True, max_length=4)

class Portfolio(models.Model):
    """
    A user's portfolio containing stocks.
    """
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    usd = models.FloatField(default=0)
    stocks = models.ManyToManyField(Stock, blank=True, through='Holding')

class Holding(models.Model):
    """
    A holding of a stock in a portfolio.
    """
    stock = models.ForeignKey(Stock)
    amount = models.FloatField(default=0.0)
    portfolio = models.ForeignKey(Portfolio, on_delete=models.CASCADE)

例如,在管理界面中,我可以使用PortfolioHolding创建amount=20,然后创建stock='ABC'。我可以复制同样的控股,但我不能。正确的方法是查找现有的持有并添加到amount

1 个答案:

答案 0 :(得分:1)

没关系,明白了......

Trick是在中间表中添加unique_together。它使股票在投资组合中独一无二。

class Holding(models.Model):
    """
    A holding of a stock in a portfolio.
    """
    stock = models.ForeignKey(Stock)
    amount = models.FloatField(default=0.0)
    portfolio = models.ForeignKey(Portfolio, on_delete=models.CASCADE)

    class Meta:
        unique_together = [('stock', 'portfolio'),]