🦔

Djangoのbulk_createでauto_now_addが効かない?など

に公開

bulk_createの話

https://docs.djangoproject.com/ja/5.2/ref/models/querysets/#bulk-create:~:text=発生します。-,bulk_create()¶,-bulk_create(objs

このメソッドは、指定されたオブジェクトのリストを効率的な方法でデータベースに挿入し (通常、オブジェクトの数にかかわらずクエリは 1 回だけです)、作成されたオブジェクトを指定された順序でリストとして返します:

大量データの一括挿入とかに使う

どんなイメージなのか?

こんなモデルが定義あると仮定する。

from django.db import models

class MyModel(models.Model):
    name = models.CharField(max_length=100)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

こんな感じで挿入する

from datetime import datetime
from django.utils import timezone

objs = [
    MyModel(name="Item 1"),
    MyModel(name="Item 2"),
]
MyModel.objects.bulk_create(objs)

# 確認コード
for obj in MyModel.objects.all():
    print(f"Name: {obj.name}, Created At: {obj.created_at}")

created_atとか必須項目(多分普通は必須になっていると思うが)になっていると挿入エラーになる

原因は?

bulk_createはSQLのINSERTを1度に発行するため、各インスタンスのsaveメソッドをスキップするらしい。

どう対応したか?

一旦、model定義からcreated_atとupdated_atをなくす形にして、挿入するようにした。
db側にはtimestmapを自動で設定するようにしているから、まぁ時刻は正しく挿入はされている。

他にもいい方法ありそうだけど、、、、

django-cors-headersの特定のバージョン入れたらDjangoのバージョンも勝手に上がった

cors-headersの4.7入れたら、Djangoのバージョンが勝手に上がってしまった。

こおいうことらしい

. django-cors-headers 4.7 が要求するDjangoの最小バージョンが、あなたの現在のDjangoバージョンよりも高い
django-cors-headers の各バージョンは、対応するDjangoのバージョン範囲を持っています。django-cors-headers 4.7 は、比較的最近のバージョンであり、最新のDjangoバージョン(Django 5.x系)への対応も含まれています。
PyPIやGitHubのリリースノートを確認すると、django-cors-headers 4.7.0 はDjango 5.2 をサポートしていることがわかります。そして、その前のバージョンである4.6.0では、Django 3.2から4.1のサポートが終了しています。
もし、あなたがそれより古いDjangoバージョン(例えばDjango 3.xや4.1以前)を使用していた場合、pip は django-cors-headers 4.7 のインストールに必要な最小のDjangoバージョンを満たすために、自動的に互換性のある最も新しいDjangoバージョン(この場合はDjango 4.2.20など)にアップグレードしようとします。

Discussion