В моем приложении есть следующие модели. Модель сложения используется для управления отношением «многие ко многим» между моделью «Книга» и моделью «Коллекция», поскольку мне нужно включить дополнительные поля в промежуточную модель.
class Book(models.Model):
name = models.CharField(max_length=200)
picture = models.ImageField(upload_to='img', max_length=1000)
price = models.DecimalField(max_digits=8, decimal_places=2)
class Collection(models.Model):
user = models.ForeignKey(User)
name = models.CharField(max_length=100)
books = models.ManyToManyField(Book, through='Addition')
subscribers = models.ManyToManyField(User, related_name='collection_subscriptions', blank=True, null=True)
class Addition(models.Model):
user = models.ForeignKey(User)
book = models.ForeignKey(Book)
collection = models.ForeignKey(Collection)
created = models.DateTimeField(auto_now=False, auto_now_add=True)
updated = models.DateTimeField(auto_now=True, auto_now_add=True)
В моем приложении пользователи могут добавлять книги в создаваемые ими коллекции (например, художественную литературу, историю и т. Д.). Затем другие пользователи могут следить за теми коллекциями, которые им нравятся.
Когда пользователь входит на сайт, я хотел бы отобразить все книги, которые были недавно добавлены в коллекции, за которыми он следит. В каждой книге я также хотел бы отобразить имя человека, добавившего ее, и название коллекции, в которой она находится.
Я могу получить все дополнения следующим образом ...
additions = Addition.objects.filter(collection__subscribers=user).select_related()
... но это приводит к тому, что дубликаты книг извлекаются и отображаются пользователю, часто рядом друг с другом.
Если есть способ получить отдельный список книг в коллекциях, за которыми следит пользователь?
Я использую Django 1.3 + MySQL.
Спасибо.
UPDATE
Я должен добавить, что в целом я не ищу каких-либо «циклических результатов и дедупликации» по нескольким причинам.
Вероятно, будут десятки или даже сотни тысяч дополнений (я также отображаю эту информацию на страницах, где перечислены все новые добавления, добавленные пользователями), и время отклика чрезвычайно важно.
Это решение может стать более практичным при ограничении исходного набора результатов, но оно создает проблемы с разбиением на страницы, что также необходимо. А именно, как вы разбиваете на страницы весь набор результатов, в то же время дедуплицируя только небольшую часть этого набора. Я открыт для любых идей, которые могут решить эту проблему.
UPDATE
Я должен также упомянуть, что если одна и та же книга будет добавлена несколькими пользователями, у меня фактически нет предпочтений, для которых добавление будет использовано, либо оригинальное, либо последнее добавление будет работать нормально.