Python 在某些类别中查找尚未发布的帖子';t投票(django投票,django类别)

Python 在某些类别中查找尚未发布的帖子';t投票(django投票,django类别),python,django,django-voting,Python,Django,Django Voting,我有一个应用程序,使用django categories应用程序,使用硬链接(ForeignKey tocategories.Category)将帖子分成不同的类别 我还使用了django投票应用程序,允许用户对某些帖子投赞成票或反对票 现在我有了一个视图,我需要从用户未投票的类别列表(用户类别白名单)中获取最新的帖子,这些帖子不是他自己的帖子。如何从DB查询负载的角度以最有效的方式获取这些帖子 这是我的帖子模型: class Post(models.Model): published

我有一个应用程序,使用
django categories
应用程序,使用硬链接(ForeignKey to
categories.Category
)将帖子分成不同的类别

我还使用了
django投票
应用程序,允许用户对某些帖子投赞成票或反对票

现在我有了一个视图,我需要从用户未投票的
类别列表(用户类别白名单)中获取最新的帖子,这些帖子不是他自己的帖子。如何从DB查询负载的角度以最有效的方式获取这些帖子

这是我的帖子模型:

class Post(models.Model):
    published = models.DateTimeField(default=datetime.now)
    author = models.ForeignKey(User, blank=True, null=True,
                               verbose_name='author', 
                               related_name='author_post')
    caption = models.CharField(max_length="240")
    image = models.ImageField(upload_to='user_images')
    up_votes = models.PositiveIntegerField(default=0)
    down_votes = models.PositiveIntegerField(default=0)
    category = models.ForeignKey('categories.Category')

我是否应该使用原始数据库查询以逆时间顺序获取帖子,其中当前登录的用户没有投票,并且这些帖子不是他自己的帖子。

取决于您的数据库。如果是
PosgtreSQL
,则可以使用子查询

voted_already = (Vote.objects.filter(user=…, 
                                     content_type=…)
                             .values_list('object_id', flat=True))
not_voted = (Post.objects.filter(category__in=…)
                         .exclude(author=…, 
                                  pk__in=voted_already)
                         .order_by('-published'))

这看起来和我已经在做的事情很相似。我只是不太确定这是否可以扩展:
vlist=Vote.objects.filter(user=request.user)post=post.objects.exclude(author\u id=request.user.id,id\u in=[item.object\u id for item in vlist])。get()
您的解决方案不使用子查询。您可以传递ID列表。如果用户对大量帖子进行了投票,那么发送给db的列表将是巨大的。我的解决方案做了一个涉及子查询的查询。它应该可以工作,但我不能保证mysql中的子查询速度很快。由于您的解决方案可以工作(尚未测试负载对此的影响),我将其标记为正确答案。如果我在负载增加时遇到问题,将在此处更新。