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



我正在尝试为库存投资组合设计数据库架构。到目前为止,我的工作似乎与一个警告一起工作 - 一个投资组合可以包含两个股票的同一股票。我希望对投资组合中的股票具有独特性。我是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)

例如,在管理界面中,我可以创建一个Portfolio,然后使用amount=20stock='ABC'创建Holding。我可以复制同样的持有,但我不应该这样做。正确的方法是查找现有的持有并添加到amount

没事,得到了...

技巧是在中间表中添加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'),]

最新更新