django ManyToManyField的Queryset过滤器?

时间:2012-03-15 02:07:10

标签: django django-admin

我试图通过覆盖来限制结果

def queryset(self, request): 
在ItemAdmin中

我想只显示request.user通过用户配置文件被授予类别访问权限的项目。

class Profile(models.Model):
    user = models.ForeignKey(auth.User, unique=True)
    categoryAccess = models.ManyToManyField(Category ...)

class Item(models.Model):
    category = models.ForeignKey(Category ...)

我无法正确理解语法....我正在尝试像

这样的事情
class ItemAdmin(admin.ModelAdmin):
    def queryset(self, request):
        qs = super(ItemAdmin, self).queryset(request)
        return qs.filter( category__in=request.user.objects__profile__categoryAccess )

有什么想法吗?非常感谢!

1 个答案:

答案 0 :(得分:2)

过滤器中的双下划线语法仅用于表达式的左侧(这是一个黑客,它实际上是一个函数的关键字参数,而那些不能是表达式)。右侧使用常规语法遍历对象:.所以你可能想要这个:

return qs.filter(category__in=request.user.profile.categoryAccess.all())

请注意,为了完成这项工作,您应该将user ForeignKey转换为OneToOneField(您不需要迁移数据库,只需更改模型定义)。