タイトルの通り。
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()
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])]
他にいい方法があれば教えてください。