无法使用Django在评估的查询集中通过索引修改对象

时间:2012-09-25 01:40:23

标签: python django django-queryset

我通过将序号分配给Documents来管理CollectionDocumentMemberships的顺序,Document是表示Collection和{{}的交集的模型1}}。这是我做的一个地方(这是Collection的方法):

memberships = self.membership_set.order_by('document__title', 'document__revision').all()
for i in range(memberships.count()):
    if memberships[i].document.category == 'SDS': 
        memberships[i].ordinal = i + 1000 # push documents in the 'SDS' category to the end
    else: memberships[i].ordinal = i # leave the rest ordered by title and then revision
    memberships[i].save() 

但是,当我在运行此代码后检查管理界面中的DocumentMemberships时,所有序数都为零(该字段的默认值)。

我通过索引访问问题时跟踪问题,但没有正确修改QuerySet中的对象。这是一个shell会话,可以更清楚地说明问题:

>>> memberships = s.membership_set.order_by('document__title', 'document__revision').all()
>>> memberships.all()
[large number of DocumentMembership objects]
>>> memberships[0]
[DocumentMembership object]
>>> memberships[0].ordinal = 2
>>> memberships[0].ordinal
0

在进一步处理之前,序数必须作为整数完全计算,所以我不能简单地迭代它。我错过了什么吗?

1 个答案:

答案 0 :(得分:2)

问题在于,当您使用索引从查询集中获取对象时,您获取的对象是原始对象的副本,因此您将修改查询集“内部”对象的副本。

如果你这样做:

m = memberships[0]
m is membership[0]

结果会得到False

试试this。也许这可以帮助您解决在查询集中使用对象索引更新其属性的问题。

希望它有所帮助!