Вы хотите хранить рейтинги и книги отдельно, что-то вроде этого (не проверено).
from django.contrib.auth.models import User
from django.db import models
from django.db.models import Sum
class BookRating(models.Model):
user = models.ForeignKey(User)
book = models.ForeignKey('Book')
# you'll want to enforce that this is only ever +1 or -1
rating = models.IntegerField()
class Meta:
unique_together = (('user', 'book'),)
class Book(models.Model):
title = models.CharField(max_length = 50)
def rating(self):
return BookRating.objects.filter(book = self).aggregate(Sum('rating'))
unique_together
требует, чтобы каждый пользователь мог оценивать данную книгу только один раз.
Затем вы можете использовать что-то вроде:
book = Book.objects.get(pk = 1)
rating = book.rating()
Добавить комментарий, если у вас есть проблемы с этим - я не проверял это, но, надеюсь, этого достаточно, чтобы вы начали.
Вероятно, вы можете избежать, чтобы каждый объект (книги, издатели, комментарии, статьи) имел отдельный объект рейтинга, используя типы контента , если хотите.
В качестве альтернативы вывозможно, стоит рассмотреть существующие многократно используемые приложения, которые обрабатывают симпатии, такие как django-likes или phileo .