3

プロジェクトで django-reversion を使用しています。そして、それは 1 つのことを除いてうまく機能します: ManyToMany フィールドの以前のバージョンを取得できません。しかし、私のコードではなく、django管理者では機能します。以前のバージョンを取得するには、次のコードを使用します。

vprod = Version.objects.get_for_date(product, ondate).get_object_version().object

「製品」が製品クラスのオブジェクトであるm2mフィールドを除いて機能します。

class Product(models.Model):
    name = models.CharField(max_length=255)
    elements = models.ManyToManyField(Sku)

class Sku(models.Model):
    name = models.CharField(max_length=255, verbose_name="SKU Name")

取得できvprod.name、必要なものを返しますが、試しvprod.elements.all()てみると、要素の数が変更されていても、現在の (最後の) バージョンのみがリストに返されます。

4

2 に答える 2

4

私の理解が正しければ、そのバージョンのリビジョンを入手する必要があると思います。バージョンにはオブジェクトのデータが含まれ、リビジョンには複数のオブジェクトのバージョンが含まれます。見て:

some_version.revision.version_set.all()

具体的には、(未テスト)を使用する必要があると思います:

[ v for v in Version.objects.get_for_date(product, ondate).revision.version_set.all() if version.content_type == ContentType.objects.get_for_model(Sku) ]

ところで、復帰は関係に従う必要があることを知っている必要があることに注意してください。低レベル APIの使用:

reversion.register(YourModel, follow=["your_foreign_key_field"])

于 2011-07-01T10:31:32.850 に答える
4

私は同じ問題を抱えていました。@Webthusiast の回答のおかげで、作業コードを取得できました。あなたの例に適応すると、このようなものになります。

輸入品:

from django.contrib.contenttypes.models import ContentType
import reversion

モデルを登録します。

reversion.register(Sku)
reversion.register(Product, follow=['elements'])

そして、繰り返すことができます:

object = Product.objects.get(some_id)
versions = reversion.get_for_object(self.object)
for version in versions:
    elements = [v.object_version.object \
        for v in version.revision.version_set.all() \
        if v.content_type == ContentType.objects.get_for_model(Product)]

これに関するドキュメントは、Read the Docs にあります。低レベル API ページの「高度なモデル登録」セクションを参照してください。

于 2014-01-03T23:27:11.907 に答える