BRHSM
BRHSM

Reputation: 884

ManyToManyField with extra information

I'm working on a django website and I need to store some information about the user like a isVerified BooleanField and a profile picture in an ImageField as well as ratings which stores ratings a user has given different elements. So I made a model like this:

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) 

however I'd like to save some more about these ratings (like a timestamp and the actual value the user rated)

Do I need to make a seperate model just for that or can this be acchieved in a better way?

Upvotes: 0

Views: 33

Answers (1)

GreyZmeem
GreyZmeem

Reputation: 650

You need to use intermediary table that can be specified via the through keyword.

For example:

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

Upvotes: 1

Related Questions