【发布时间】:2012-01-04 05:50:57
【问题描述】:
我的应用中有以下模型。 Addition 模型用于管理 Book 模型和 Collection 模型之间的多对多关系,因为我需要在中间模型上包含额外的字段。
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。
谢谢。
更新
我应该补充一点,一般来说,出于几个原因,我不会寻找任何“遍历结果并以这种方式去重复”的解决方案。
可能会有数万甚至数十万的添加(我也在列出用户添加的所有新添加的页面上显示此信息),响应时间非常重要。
这种解决方案在限制初始结果集时可能会变得更实用,但它会产生分页问题,这也是必需的。即,您如何对整个结果集进行分页,同时仅对该结果集的一小部分进行重复数据删除。我愿意接受任何可以解决这个问题的想法。
更新
我还应该提到,如果同一本书被多个用户添加,我实际上并没有偏好使用哪个添加,无论是原始添加还是最近添加都可以。
【问题讨论】:
-
您是否尝试在查询集末尾添加
.distinct()? -
@gorus 只会给我一组不同的 Addition 对象。我需要的是一组具有不同书籍的 Addition 对象,类似于
Addition.objects.all().distinct('book') -
Book.objects.filter(addition__collection__subscribers=user).distinct()
-
@armonge 但是如果没有来自模板的额外查询,我无法显示每个图书实例的相关添加和收藏信息,导致每页有数百个查询。
-
我想你也应该澄清一下:如果同一本书被多个用户添加,你更喜欢哪个添加......
标签: mysql django django-queryset