0

最後の POST/PUt/DELETE またはデータベース内のあらゆる種類のトランザクションを元に戻したいです。Django-reversionについて読み、実装してみました。しかし、運が悪かった。これが私のコードです。私が何をしているのか確認してください!!!

反転するモデル:-

@reversion.register
class Shipment(models.Model):
    job_id = models.CharField(max_length = 255)
    time = models.DateTimeField( auto_now_add = True, db_index = True)

@reversion.register
class ShipmentScanMapping(models.Model):
    arm_id = models.CharField(max_length = 255)
    status = models.CharField(max_length = 255)
    barcode = models.CharField(max_length = 255)
    reference_number = models.CharField(max_length = 255)
    customer_name = models.CharField(max_length = 255)
    shipment = models.ForeignKey('Shipment',related_name ='scans')
    time = models.DateTimeField( auto_now_add = True)

ビュー

@csrf_exempt
@reversion.create_revision()
def db_commit(request):

    arm_id = scan_status = barcode = reference_number = customer_name = job_id = 12
    if request.is_ajax():
        shipment_obj = Shipment(job_id = job_id)
        shipment_obj.save()

        ShipmentScanMapping.objects.create(arm_id = arm_id,status = scan_status,barcode = barcode,reference_number = reference_number,
                                                customer_name = customer_name ,shipment= shipment_obj)

        return HttpResponse(json.dumps('Success'), content_type = "application/json")        

@csrf_exempt
def db_undo(request):
    job_id = 12 # just for demo purpose
    shipment_obj = Shipment.objects.filter(job_id = job_id).order_by('-time')[0]

    your_model = ShipmentScanMapping.objects.get(shipment = shipment_obj)
    version_list = reversion.get_unique_for_object(your_model)[0]
    #version_data = version_list.field_dict
    #print version_data
    version_list.revert()

    return HttpResponse(json.dumps('Success'), content_type = "application/json")        

私は何を間違っていますか??

4

1 に答える 1

1

あなたの例では、新しいオブジェクトを作成するだけです。この場合django-reversion、このオブジェクトの初期状態の復帰を作成しますがdjango-reversion、以前のリビジョンの状態にロールバックできます。したがって、ShipmentScanMappingオブジェクトを変更して再試行してください。

アップデート

データの初期化:

>>> import reversion
>>> with reversion.create_revision():
...     shipment_obj = Shipment(job_id = 12)
...     shipment_obj.save()
...
>>> reversion.get_unique_for_object(shipment_obj)
[<Version: Shipment object>]
>>> with reversion.create_revision():
...     your_model = ShipmentScanMapping.objects.create(arm_id = 12,status = 12,barcode = 12,reference_number = 12,customer_name =12,shipment=shipment_obj)
...
>>> reversion.get_unique_for_object(your_model)
[<Version: ShipmentScanMapping object>]
>>> your_model.arm_id
12
>>> your_model.id
1

データの更新:

>>> with reversion.create_revision():
...     your_model.arm_id=15
...     your_model.save()
...
>>> reversion.get_unique_for_object(your_model)
[<Version: ShipmentScanMapping object>, <Version: ShipmentScanMapping object>]
>>> ShipmentScanMapping.objects.get(id=1).arm_id
15
>>> [r.field_dict.get('arm_id') for r in reversion.get_unique_for_object(your_model)]
[u'15', u'12']

元に戻す:

>>> rev = reversion.get_unique_for_object(your_model)[-1]
>>> rev.field_dict.get('arm_id')
u'12'
>>> rev.revert()
>>> ShipmentScanMapping.objects.get(id=1).arm_id

Update2

更新された変更のみを元に戻すことはできますか (PUT)、または POST/DELETE 要求も元に戻すことができますか?

削除されたオブジェクトを復元することもできます。 docsを参照してください。

どうすれば n レベルまで戻すことができますか?? [-1] は、DB が最新の更新に戻されることを意味しますか?

get_unique_for_objectメソッドは、以前のすべてのバージョンのリストを、最新バージョンを最初に返します。そのため、Python のリストから通常の選択を選択できます。ところで、特定の日付の最新バージョンを見つけることができます。

rev = reversion.get_for_date(your_model, datetime.datetime(2008, 7, 10))

Update3

最初の場合、値は 3 で、12 で更新されてから 3 に戻りました。値 12 はどうなりますか?? また、挿入 (POST) クエリを元に戻すにはどうすればよいですか。

さて、それがどのように機能するかを考えてみましょう。モデルを登録すると、はモデルからの信号のdjango-reversion監視を開始します。post_saveモデルへの変更を保存するたびに、Django シリアライゼーション フレームワークを使用して JSON 文字列にシリアライズされ、reversion.models.Versionモデルとしてデータベースに保存されます。

したがって、一部のバージョンを元に戻す必要がある場合django-reversionは、データベースから適切なバージョン モデルを読み込み、モデル データを逆シリアル化し、古いデータを再度保存します。メソッド save を呼び出さないと、再保存中に現在の状態が失われます。呼び出された場合、状態は適切なバージョンに保存されます (上記のテキストを参照)。

作成したばかりのオブジェクトを元に戻す必要がある場合は、手動で削除する必要があります。

于 2014-11-11T08:39:47.390 に答える