読者です 読者をやめる 読者になる 読者になる

DjangoのORMでINSERTのSQL文字列を取得する

Python Django

タイトルの通り。
DjangoのORMでSELECTのSQLを取得するのは、QuerySetクラスのquery属性を参照すればいいのだけど、INSERTの場合は簡単に取得できる方法がなさそうに見えた。
内部APIをゴニョゴニョすることで、何とか取得できる。
以下、コード例。

myapp/models.py

from django.db import models

class Item(models.Model):
    name = models.CharField(max_length=100)
    price = models.IntegerField()

このモデルのインスタンスをINSERTするSQL文字列を取り出してみる。

Djangoシェルでの実行結果

>>> from django.db.models import sql
>>> from myapp.models import Item
>>> item = Item(name='Spam', price=400)
>>> query = sql.InsertQuery(Item)
>>> query.insert_values(Item._meta.local_fields, [item])
>>> compiler = query.get_compiler(using="default")
>>> # return_idプロパティを設定しないとas_sqlで落ちる
>>> compiler.return_id = True
>>> statements = compiler.as_sql()
>>> print statements
[(u'INSERT INTO `myapp_item` (`id`, `name`, `price`) VALUES (%s, %s, %s)', [None, 'Spam', 400])]

他にいい方法があれば教えてください。