0

我通过将序数分配给 来管理Documentsa的顺序,这是表示 a和 a交集的模型。这是我这样做的一个地方(这是在一个方法中):CollectionDocumentMembershipsDocumentCollectionCollection

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

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

4

1 回答 1

2

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

如果你这样做:

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

你得到False结果。

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

希望能帮助到你!

于 2012-09-25T04:00:11.307 回答