【问题标题】:ManyToManyField with extra information带有额外信息的 ManyToManyField
【发布时间】:2018-06-25 15:27:50
【问题描述】:

我在一个 django 网站上工作,我需要存储一些关于用户的信息,例如 isVerified BooleanField 和 ImageField 中的个人资料图片,以及存储用户给出不同 elements 的评级的评级。所以我做了一个这样的模型:

class UserProfile(AbstractBaseUser):
    is_verified = models.BooleanField(default=True)
    current_profile = models.ImageField(default=static('img/default_profile.jpg'))
    ratings     = models.ManyToManyField(Element, on_delete=models.CASCADE) 

但是我想保存更多关于这些评分的信息(例如时间戳和用户评分的实际值)

我需要为此制作一个单独的模型还是可以以更好的方式实现?

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    您需要使用可以通过through 关键字指定的中间表。

    例如:

    class UserProfile(AbstractBaseUser):
        is_verified = models.BooleanField(default=True)
        current_profile = models.ImageField(default=static('img/default_profile.jpg'))
        ratings = models.ManyToManyField(Element, on_delete=models.CASCADE, through='UserProfileElement')
    
    class UserProfileElement(models.Model):
        user = models.ForeignKey(UserProfile, models.CASCADE, verbose_name=_('User'))
        element = models.ForeignKey(Element, models.CASCADE, verbose_name=_('Element'))
        timestamp = models.DateTimeField(_('Timestamp'), auto_now_add=True)
        rating = models.PositiveIntegerField(_('Rating'))
    
        class Meta:
            unique_together = ('user', 'element')
    

    Django docs: ManyToManyField.through

    【讨论】: