为什么我的django模型没有保存?
我在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') 问题是什么?问题是,匹配项不仅仅是一个列
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]
无法更新)