如何根据django中的外键计数显示已过滤的管理列表

时间:2012-07-13 15:45:43

标签: django django-models django-admin django-queryset

我正在尝试为我的管理员视图定义代理模型,并让它只显示具有一定数量外键值的对象。

这就是我正在尝试的,但我无法过滤yVotes:

class Post(models.Model):
    title = models.CharField(max_length=512)

class PostVote(models.Model):
    post = models.ForeignKey(Post)
    vote = models.CharField(max_length=1)

class VotedPost(models.Post):
    def _yVotes(self):
        return models.PostVote.objects.filter(post=self, vote='Y').count()
    yVotes = property(_yVotes)
    class Meta:
        proxy = True 

class VotedPostAdmin(PostAdmin):
    list_display = ('title', 'yVotes')
    def queryset(self, request):
        return self.model.objects.filter(yVotes__gt=0)

所以我的最终结果是当您浏览VotedPost的/ admin页面时,它只会显示超过0'Y'投票的帖子。在VotedPostAdmin中注释掉查询集时,yVotes的正确值将显示在list_display中。

提前致谢!

2 个答案:

答案 0 :(得分:2)

这是迄今为止我最终得到的解决方案,以便为我提供所需的结果。如果有人有更优雅的解决方案,我会等待接受:

class VotedPostAdmin(PostAdmin):
    list_display = ('title', 'yVotes')
    def queryset(self, request):        
    return VotedPost.objects.all().annotate(count = Count('postvote')).order_by('-count').filter(count__gt=0).filter(postvote__vote='Y')

答案 1 :(得分:1)

为什么不覆盖get_queryset或使用管理过滤器来创建此类显示。你正在尝试的东西似乎过于复杂tbh

class PostAdmin(admin.ModelAdmin):
    def queryset(self, request):
        qs = super(ThisAdmin, self).queryset(request)
        # do stuff and return whatever