每个用户限制每本书的单一评级:Django ORM

时间:2017-01-17 17:59:45

标签: python django django-models django-orm

  

编辑标题:将多个“多对一”字段限制为“一对一”关联:Django

我们预订用户评级作为Django模型。

  • 每个 图书 评分
  • 每个 评分都有一个 图书
  • 每个 用户 评分
  • 每个 评级都有一个 用户

For Book

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

问题陈述

如何确保每位用户最近每本书一个评分?

1 个答案:

答案 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的问题。