我有一个模特:
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
这意味着用户已经对该产品进行了投票。
怎么了?我应该进行哪些更改才能使其正常工作?
答案 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。