为什么我的django模型没有保存?

为什么我的django模型没有保存?,django,django-models,Django,Django Models,我在Django应用程序中有一个看似简单的测试用例,但失败了: def test_matches(self): # setup code... matches = tournament.match_set.order_by('match_id') matches[0].winner = 'a' matches[0].save() self.assertEqual(matches[0].winner, 'a') 问题是什么?问题是,匹配项不仅仅是一个列

我在Django应用程序中有一个看似简单的测试用例,但失败了:

def test_matches(self):
    # setup code...

    matches = tournament.match_set.order_by('match_id')

    matches[0].winner = 'a'
    matches[0].save()
    self.assertEqual(matches[0].winner, 'a')

问题是什么?

问题是,
匹配项
不仅仅是一个列表,而是一个
查询集
:索引和切片
查询集
访问数据库,因此每个
匹配项[0]
都会返回一个新的匹配项<代码>匹配[0]。因此保存()会保存未修改的对象

如@Wtower所述,找到了相关的文档

应该这样写:

    m = matches[0]
    m.winner = 'a'
    m.save()
    self.assertEqual(matches[0].winner, 'a')
或者,如果需要,强制计算
QuerySet

    matches = list(tournament.match_set.order_by('match_id'))
或者更好,如果您可以在数据库中识别匹配项:

    matches.filter(match_id=0).update(winner=0)

这种方法更短,在不将数据加载到python的情况下进行就地更新,从而消除了可能的争用条件。但是,对
match_id
的过滤(通常)与对
QuerySet
进行索引不同。(切片的
查询集
匹配[0:1]
无法更新)

问题在于
匹配
不仅仅是一个列表,而是
查询集
:索引和切片
查询集
访问数据库,因此每个
匹配[0]
都会返回一个新的匹配<代码>匹配[0]。因此保存()会保存未修改的对象

如@Wtower所述,找到了相关的文档

应该这样写:

    m = matches[0]
    m.winner = 'a'
    m.save()
    self.assertEqual(matches[0].winner, 'a')
或者,如果需要,强制计算
QuerySet

    matches = list(tournament.match_set.order_by('match_id'))
或者更好,如果您可以在数据库中识别匹配项:

    matches.filter(match_id=0).update(winner=0)
这种方法更短,在不将数据加载到python的情况下进行就地更新,从而消除了可能的争用条件。但是,对
match_id
的过滤(通常)与对
QuerySet
进行索引不同。(切片的
QuerySet
like
匹配[0:1]
无法更新)