2012-03-15 156 views
0

我试图通过内ItemAdmin覆盖django ManyToManyField的Queryset过滤器?

def queryset(self, request): 

限制的结果。

我想仅显示通过用户配置文件被授予了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) 

任何想法的东西呢?非常感谢!

回答

2

过滤器中的双下划线语法仅用于表达式的左侧(这是一个骇人听闻的事实,即它实际上是函数的关键字参数,而这些参数不能是表达式) 。右手边用正常的语法来遍历对象:.所以你可能会这样:

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

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

+0

嘿丹尼尔!非常感谢...我将该字段更改为OneToOne,但我得到'配置文件匹配查询不存在'。 – cssndrx 2012-03-15 02:54:52

+0

哦,哎呀!实际上这是我的不好。代码打破了,因为用户在创建时没有配置文件。只是捕获该异常并返回空列表是否正确?感谢修复:) – cssndrx 2012-03-15 03:01:46

+1

只是为了确认...向后关系user.profile将工作,对吧?我在文档中看到,与__语法可能存在后向关系。但是,当我创建一个配置文件,然后尝试过滤:我得到一个非传统的Django错误。它说:“数据库错误:数据库安装有问题,确保已经创建了适当的数据库表,并确保数据库可以被适当的用户读取。”有没有人见过这个? – cssndrx 2012-03-15 15:44:38

相关问题