0

aと aの交点を表すモデルである に序数をつけDocumentsて aの順番を管理しています。これを行う場所の 1 つを次に示します (これは のメソッド内にあります)。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 内のオブジェクトが適切に変更されないという問題を追跡しました。これは、問題をより明確に示すシェル セッションです。

>>> 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 に答える