0

如何在 Django 中发送到模板之前替换查询集中的对象?

楷模

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
4

1 回答 1

0

你能发布模块如何在模板中使用吗?根据 karthikr 的建议,您应该过滤查询集而不是修改其内部状态,因为QuerySet实例表示来自数据库的对象集合,其内容作为查询集评估时间点的快照(如果您确实需要修改它,在查询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
于 2013-06-15T13:43:17.113 回答