编辑标题:将多个“多对一”字段限制为“一对一”关联:Django
我们预订,用户和评级作为Django模型。
class Book(models.Model):
isbn = models.CharField(max_length=32)
title = models.CharField(max_length=256)
def __str__(self):
return self.title
class BookRating(models.Model):
book = models.ForeignKey(Book, on_delete=models.CASCADE)
user = models.ForeignKey(User, on_delete=models.CASCADE)
rating = models.SmallIntegerField(choices=[(i, i) for i in range(1, 6)])
def __str__(self):
return self.rating
如何确保每位用户最近每本书一个评分?
答案 0 :(得分:3)
只做
class BookRating(models.Model):
book = models.ForeignKey(Book, on_delete=models.CASCADE)
user = models.ForeignKey(User, on_delete=models.CASCADE)
rating = models.SmallIntegerField(choices=[(i, i) for i in range(1, 6)], default=1)
class meta:
unique_together = ('book','user')
您的模型确实实现了多对多关系,但是您无法完全访问django ManyToMany功能。我建议你做这样的事情:
class Book(models.Model):
isbn = models.CharField(max_length=32)
title = models.CharField(max_length=256)
ratings = models.ManyToManyField(User,through='BookRating')
当您执行此操作时,您的BookRating可以保持不变,但对Book模型的微小更改使您可以完全访问此处所述的api:https://docs.djangoproject.com/en/1.10/topics/db/examples/many_to_many/
有趣的是,如上所述修改Book模型不会对数据库中的表结构进行任何更改。他们保持不变。这只是解锁api的问题。