在发送到模板之前,在视图中替换queryset中的对象?

时间:2013-06-15 13:05:00

标签: python django

如何在发送到django中的模板之前在视图中替换queryset中的对象?

模型

class Level(models.Model):
    [...]
    previous_level = ForeignKey('Level', blank=True, null=True)

class CompletedLevel(models.Model):
    user = models.ForeignKey('Auth.user')
    level = models.ForeignKey('Level')
    result = models.IntegerField()

的观点:

levels = Level.objects.filter(previous_level=None)
for i,level in enumerate(modules):
    try:
        #if level is completed with result > 80 then replace this level with next level
        if CompletedLevel.objects.get(result__gt=80):
            modules[i] = Module.objects.get(previous_level=level)
    except:
        pass

收到错误:

'QuerySet' object does not support item assignment

1 个答案:

答案 0 :(得分:0)

您可以发布模块在模板中的使用方式吗?根据karthikr的建议,您应该过滤查询集而不是修改其内部状态,因为QuerySet实例表示来自DB的对象集合,其内容作为查询集评估时的快照(如果你真的需要修改它,在查询集被评估后检查modules._result_cache ...)。

如果在模板中迭代查询集,您可以编写一个生成器,如:

def modified_module():
   for i, module in enumerate(modules):
      if [...] :
          try:
              yield Module.objects.get( [...] )
          except:
              yield module
      else:
          yield module
 # and iterate on modified_module() in template

或者您可以应对复制版本:

modules = list(modules)
# do modifications