2011-09-06 104 views
1

我继承了一个提供高中体育信息的Django应用程序。__in过滤器不起作用

teams = Team.objects.filter(season__school_year__in=school_year_filter_list) 

school_year_filter_list包含[1,3]

此查询导致一个错误:所以从当前季节,我完成这种方式仅显示信息我最近收到修改一组特定的数据的请求pgpool(Postgres数据库池/复制实用程序),所以我不能使用它。作为一个方面说明,查询在Python shell中正常工作,并且绕过pgpool并直接使用Postgres。但是,我们的网络体系结构决定使用pgpool,因此我试图找到一种替代方法来检索相同的数据。

你能帮助我确定另一种方法来获得当前SchoolYear中所有球队的一个赛季吗?

(简化)模型是这样的:

class Team(models.Model): 
    season = models.ForeignKey(Season) 

class Season(models.Model): 
    school_year = models.ForeignKey(SchoolYear, blank=True, null=True) 

class SchoolYear(models.Model): 
    school_year = models.CharField(max_length=150) 

的 '_schoolyear' 表如下所示:

id | school_year 
----+------------- 
    1 | 2010-2011 
    2 | 2009-2010 
    3 | 2011-2012 
+1

这样一个基本的查询应该不会导致出现问题,无论使用的数据库的。此外,如果它是一个真正的bug,它应该被正确识别,以便可以在Django代码中进行说明。如果您提供了查找引起的错误的详细信息,那将非常有用。我不禁想象'__in'查找会在某个时候再次出现,或者你最终不得不想出一些甚至不应该成为问题的奇怪修复。 –

+1

@Jordan Reiter:谢谢您的反馈。我们在应用程序的其他地方使用'__in'查找没有问题。这个问题只存在于这个特定的查询中,并且只与特定版本的pgpool(3.0.3,3.0.4)一起存在。我们将在以后开发并提交适当的错误报告,但现在,找到一个解决方法是一个更高的优先级。 –

回答

1

最后,我修改了另一个模型来完成这项工作。而不是解析年来获得活跃的季节,我添加了一个“活跃”标志学年模型和改进我的查询以检查标志:

def queryset(self, request): 
    qs = super(PlayerYearAdmin, self).queryset(request) 
    return qs.filter(team__season__school_year__active=True) 
0

你试过
teams = Team.objects.filter(season__school_year__id__in=school_year_filter_list)school_year_filter_list是学年ID的列表是不是正确?

+0

'school_year_filter_list'是学校年份ID列表。这是我的理解,“__id”不是必需的,但我尝试按照您的建议的方式过滤器,收到相同的结果。 –

0

小记:我看到 'Django的管理' 标签,所以我认为你=添加season__school_year_ [1,2] URL查询字符串如/管理/体育/团队/季节 _school_year__in = [1? ,2]是否正确?

如果是这样,你舒尔是school_year_filter_list包含列表[1,3],但不包含列表'[1,3]'

您能否向我们提供有关错误pgpool数据或者Django的ORM返回repr一个字符串?

+0

感谢您的回复。查询过滤器在admin.py中被硬编码,并且不通过URL提供。 'school_year_filter_list'绝对是一个列表,而不是一个字符串。 pgpool错误很简单:'psycopg2。InterfaceError:连接已经关闭'经过广泛的测试后,我们确定这是Django与pgpool进行通信的一种错误,可能是驱动程序问题。 –