1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

djangoで、一意制約を持ったカラムの値を入れ替える

Last updated at Posted at 2023-07-31

結論

値を入れ替えたい2つの行情報のうち、1行の対象カラムを一時的に別の値に更新することでタイトルのことができます。

解説

一意制約を持ったカラムは、一意であることが保証されています。そのため、いずれかの行と重複するような値に更新しようとするとエラーが発生します。ある2行に対して一意制約を持ったカラムの値を入れ替えたい場合、1行ずつ更新しようとするとどこかで一意制約にかかりエラーとなります。そこで、一方を一時的に別の値に更新し、入れ替えを行えるようにします。

サンプルコード

views.py
from django.db import transaction

# viewとなる関数を作成している想定
# hogeFieldが一意製制約を持っているIntegerFieldと想定

# エラーが起きた時にロールバックさせるため
@transaction.atomic
def hoge(request)
    # ...
    # 値を交換したい行情報を取得
    item1 = Item.objects.get(pk=0)
    item2 = Item.objects.get(pk=1)
    
    hoge_tmp = item2.hogeField
    # 必ず重複しないことが保証できる値を一時的に設定する
    item2.hogeField = -2000000000
    item2.save()
    
    # item1の値と「退避したitem2(hoge_tmp)」の値を入れ替え
    item1.hogeField, hoge_tmp = hoge_tmp, item1.hogeField
    item1.save()
    
    item2.hogeField = hoge_tmp
    item2.save()
    # ...

以上です。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?