将附加价值关联到多领域

时间:2018-07-02 19:25:58

标签: django django-models

我有2本书和最喜欢的书

class Book(models.Model):
title = models.CharField(max_length=200)

class Favorite(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
favorites = models.ManyToManyField(Book, related_name='favorited_by')

用户在这里拥有自己的收藏夹集。我想为每个选中的喜欢的书关联一个额外的变量,但是该怎么做呢?

1 个答案:

答案 0 :(得分:1)

您可以定义through模型:该模型用于编写多对多关系。但是您的建模通常有点奇怪。为什么在这里使用OneToOneFieldUser?不是Favorite单人的最爱(因此单人用户喜欢单人的书这一事实:

from django.conf import settings

class Book(models.Model):
    title = models.CharField(max_length=200)
    users = models.ManyToManyField(settings.AUTH_USER_MODEL, through='Favorite')

class Favorite(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    book = models.ForeignKey(Book, on_delete=models.CASCADE)
    additional = models.IntegerField()

因此,我们将其建模为三个模型:

+-------+ 1   M +------------+ N    1 +------+
| Book  |-------| Favorite   |--------| User |
+-------+       +------------+        +------+
| title |       | additional |
+-------+       +------------+

现在Favorite被视为 a User喜欢 a Book的事实。不是作为附加到User的一对一模型实例,该实例将包含所有收藏夹。

有关更多信息,see the documentation on the through parameter [Django-doc]