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

2024-04-24 03:39:52 发布

您现在位置:Python中文网/ 问答频道 /正文

Edited Title : Limit multiple "Many to One" fields into "One to One" association : 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

问题陈述

如何确保每个用户在每本书上都有一个评分?你知道吗


Tags: todjango用户selfmodeltitlemodels评分
1条回答
网友
1楼 · 发布于 2024-04-24 03:39:52

就这么做吧

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多对多功能。我建议你这样做:

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的问题。你知道吗

相关问题 更多 >