【发布时间】:2015-01-11 06:13:46
【问题描述】:
我正在尝试按com_proc 变量进行过滤,但它不起作用...
这里的复杂性在于过滤器可以包含 不止一次的同一个对象。这是我的代码:
class Act(models.Model):
com_proc=models.CharField(max_length=100, blank=True, null=True, default=None)
cs_1=models.ForeignKey(CodeSect, related_name='code_sect_1', blank=True, null=True, default=None)
cs_2=models.ForeignKey(CodeSect, related_name='code_sect_2', blank=True, null=True, default=None)
cs_3=models.ForeignKey(CodeSect, related_name='code_sect_3', blank=True, null=True, default=None)
class ActIds(models.Model):
propos_origine=models.CharField(max_length=4, blank=True, null=True, default=None)
act=models.ForeignKey(Act)
qs_acts=ActIds.objects.none()
len(qs_acts)
for act in ActIds.objects.all():
#loop over each cs variable
for nb in range(1,4):
code_sect=getattr(act.act, "cs_"+str(nb))
if code_sect is not None:
qs_acts._result_cache.append(act)
print "qs_acts"
for act in qs_acts:
print act.pk, act.act.com_proc, act.propos_origine
我使用动态queryset 和_result_cache,因为每个对象在过滤器中最多可以出现三次(每个cs 变量一次)。我不知道如何通过普通过滤来重现它。
输出:
9429 Oral procedure COM
9429 Oral procedure COM
9697 Written procedure COM
12352 Written procedure COM
12362 Oral procedure COM
代码:
...
print filter_vars_periods
输出:
{'act__com_proc': 'Written procedure', 'propos_origine': 'COM', 'act__adopt_conseil__gte': datetime.date(2009, 12, 1), 'act__adopt_conseil__lte': datetime.date(2013, 12, 31)}
代码:
temp_filter=qs_acts.filter(**filter_vars_periods)
for act in temp_filter:
print act.pk, act.act.com_proc, act.propos_origine
输出:
9429 Oral procedure COM
9429 Oral procedure COM
9697 Written procedure COM
12352 Written procedure COM
12362 Oral procedure COM
您可以看到com_proc="Written procedure" 的过滤不起作用,最后我得到了相同的查询集。为什么?
编辑
我想我知道为什么两个连续的过滤没有给出预期的输出:
Chaining multiple filter() in Django, is this a bug?
据说使用两个过滤器不等同于逻辑AND,而是等同于逻辑OR。所以这可能是我的第二个过滤器不过滤任何东西的原因......
无论如何,我仍然不知道如何解决我的问题:(。
【问题讨论】:
-
您添加的链式多重过滤器链接与您的问题无关。只有当您遍历一对多关系(或多对多)时,该功能才会发挥作用。如果您尝试根据 ActId 的属性获取 Acts,那么您会担心。
标签: django dynamic filtering django-queryset