Django ORM关系一对多

时间:2019-06-25 09:22:27

标签: python django python-3.x django-models

我有一个模特:

class Product(models.Model):
    title = models.CharField(max_length=200)
    url = models.URLField()
    pub_date = models.DateTimeField()
    votes_total = models.IntegerField(default=1)
    image = models.ImageField(upload_to='images/')
    icon = models.ImageField(upload_to='images/')
    body = models.TextField()
    hunter = models.ForeignKey(User, on_delete=models.CASCADE)

现在,我想添加支持者的功能,以了解用户已经投票选择的产品。 我需要这样做,以便用户只能对一种产品进行一次投票。
再次说明一下-用户可以对多个产品进行投票,但每个产品只能投票一次。
因此,关系是一种产品-许多用户(支持者)
我尝试添加下一个字段,但是即使提供了默认字段,也无法进行迁移。我也尝试清除数据库,但再次无法使其正常工作。

upvoters = models.ForeignKey(User, on_delete=models.CASCADE, related_name='upvoted')

我想它可以通过以下方式工作:

  

字段,用于确定推荐的产品。   要检查用户是否已对产品进行过投票,请致电:User.upvoted.filter(id=product.id).count() == 1   这意味着用户已经对该产品进行了投票。

怎么了?我应该进行哪些更改才能使其正常工作?

1 个答案:

答案 0 :(得分:3)

您将不得不使用ManyToMany,但是您可以使用自定义直通模型来限制产品/投票组合。

在产品类中,添加:

voters = models.ManyToManyField(User, through='ProductVote', related_name='product_voters')

然后通过模型添加自定义:

class ProductVote(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    product = models.ForeignKey(Vote, on_delete=models.CASCADE)

    class Meta:
        unique_together = ['user', 'product']

如果您尝试为相同的用户/产品组合添加投票,则会引发IntegrityError。