<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ハセテツラボ &#187; Django</title>
	<atom:link href="http://tt-house.com/tag/django/feed" rel="self" type="application/rss+xml" />
	<link>http://tt-house.com</link>
	<description>生涯一開発屋</description>
	<lastBuildDate>Wed, 08 Sep 2010 23:42:04 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>DjangoでDatetimeのフィールドを年月でGroupByして集計する方法</title>
		<link>http://tt-house.com/2010/07/django-annotate-groupby.html</link>
		<comments>http://tt-house.com/2010/07/django-annotate-groupby.html#comments</comments>
		<pubDate>Thu, 29 Jul 2010 02:53:25 +0000</pubDate>
		<dc:creator>ハセテツ</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://tt-house.com/?p=328</guid>
		<description><![CDATA[以前のエントリーで集計クエリを利用する方法を説明しましたが、それだとDatetimeのフィールドを「年月」ごとに、っていう集計はできませんでした。購買履歴データを月別に件数集計したいときなんかは非常に困るんですよね。ので、それを解決する方法です。 select_column = {&#8220;d_column&#8221;:  &#8221;DATE_FORMAT(pub_date, &#8216;%%Y%%m&#8217;)&#8221;} _list = PurchaseRecord.objects.extra(select=select_column) _list = _list.values(&#8220;d_column&#8221;).annotate(cnt=Count(&#8216;id&#8217;)) 上記はMySQLを利用しているケースの書き方です。 あ、横長になると見難いから2行に分けただけで、1行で大丈夫ですからね。 「ORマッパー使ってるのにデータベースに依存ってなによ」 な感じではありますが、extraを使っている部分は直接クエリが流れるみたいですね。 つまり、「DATE_FORMAT(pub_date, &#8216;%%Y%%m&#8217;)」の部分は select *,DATE_FORMAT(pub_date, &#8216;%Y%m&#8217;) as d_column from app_purchaserecord といった風に、追加されるのです。で、追加されたカラムを使って集計、という流れですね。うっかりミスりやすいのが「%」を二つにする点でしょうか。 あと、データベースを変えたら「select_column～」の部分に修正が必要です。使用するデータベースに依存した書き方になります。ここは要注意ですね。]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Ftt-house.com%252F2010%252F07%252Fdjango-annotate-groupby.html%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2Faztedn%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Django%E3%81%A7Datetime%E3%81%AE%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%82%92%E5%B9%B4%E6%9C%88%E3%81%A7GroupBy%E3%81%97%E3%81%A6%E9%9B%86%E8%A8%88%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%22%20%7D);"></div>
<p><a title="Djangoで集計クエリ（1.1以降でannotateを使用）" href="http://tt-house.com/2010/04/django-query-annotate.html" target="_blank">以前のエントリーで集計クエリを利用する方法を説明</a>しましたが、それだとDatetimeのフィールドを「年月」ごとに、っていう集計はできませんでした。購買履歴データを月別に件数集計したいときなんかは非常に困るんですよね。ので、それを解決する方法です。</p>
<blockquote>
<div id="_mcePaste">select_column = {&#8220;d_column&#8221;:  &#8221;DATE_FORMAT(pub_date, &#8216;%%Y%%m&#8217;)&#8221;}</div>
<div id="_mcePaste">_list = PurchaseRecord.objects.extra(select=select_column)<br />
_list = _list.values(&#8220;d_column&#8221;).annotate(cnt=Count(&#8216;id&#8217;))</div>
</blockquote>
<p>上記はMySQLを利用しているケースの書き方です。</p>
<p>あ、横長になると見難いから2行に分けただけで、1行で大丈夫ですからね。</p>
<p>「ORマッパー使ってるのにデータベースに依存ってなによ」</p>
<p>な感じではありますが、extraを使っている部分は直接クエリが流れるみたいですね。<br />
つまり、「<span style="font-size: 13.2px;">DATE_FORMAT(pub_date, &#8216;%%Y%%m&#8217;)</span><span style="font-size: 13.2px;">」の部分は</span></p>
<blockquote>
<div><span style="font-size: 13.2px;">select *,</span><span style="font-size: 13.2px;">DATE_FORMAT(pub_date, &#8216;%Y%m&#8217;) as d_column<br />
from app_purchaserecord </span></div>
</blockquote>
<p>といった風に、追加されるのです。で、追加されたカラムを使って集計、という流れですね。うっかりミスりやすいのが「%」を二つにする点でしょうか。</p>
<p>あと、データベースを変えたら「select_column～」の部分に修正が必要です。使用するデータベースに依存した書き方になります。ここは要注意ですね。</p>

]]></content:encoded>
			<wfw:commentRss>http://tt-house.com/2010/07/django-annotate-groupby.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Djangoのmodelで自分自身に対するリレーション（再帰的なリレーション）を張る</title>
		<link>http://tt-house.com/2010/07/django-self-relation.html</link>
		<comments>http://tt-house.com/2010/07/django-self-relation.html#comments</comments>
		<pubDate>Wed, 28 Jul 2010 08:22:59 +0000</pubDate>
		<dc:creator>ハセテツ</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://tt-house.com/?p=326</guid>
		<description><![CDATA[例えば組織図なんかのmodelを構築する際に、「属する部門」を表現するには再帰的なリレーションを使うことになると思います。「部門が属する部門」ですね。 class Div(models.Model): name = models.CharField(max_length=100) upper = models.ForeignKey(Div) だと、syncdbの時に「Divなんてありません」と怒られてしまいます。そりゃそうだ。 ので、 class Div(models.Model): name = models.CharField(max_length=100) upper = models.ForeignKey(&#8216;self&#8217;) と書きます。 Python2.5、Django1.1.1でのお話でした。]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Ftt-house.com%252F2010%252F07%252Fdjango-self-relation.html%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2F9CZXSa%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Django%E3%81%AEmodel%E3%81%A7%E8%87%AA%E5%88%86%E8%87%AA%E8%BA%AB%E3%81%AB%E5%AF%BE%E3%81%99%E3%82%8B%E3%83%AA%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%EF%BC%88%E5%86%8D%E5%B8%B0%E7%9A%84%E3%81%AA%E3%83%AA%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%EF%BC%89%E3%82%92%E5%BC%B5%E3%82%8B%22%20%7D);"></div>
<p>例えば組織図なんかのmodelを構築する際に、「属する部門」を表現するには再帰的なリレーションを使うことになると思います。「部門が属する部門」ですね。</p>
<blockquote><p>class Div(models.Model):</p>
<p style="padding-left: 30px;">name = models.CharField(max_length=100)</p>
<p style="padding-left: 30px;">upper = models.ForeignKey(Div)</p>
</blockquote>
<p>だと、syncdbの時に「Divなんてありません」と怒られてしまいます。そりゃそうだ。<br />
ので、</p>
<blockquote><p>class Div(models.Model):</p>
<p style="padding-left: 30px;">name = models.CharField(max_length=100)</p>
<p style="padding-left: 30px;">upper = models.ForeignKey(&#8216;self&#8217;)</p>
</blockquote>
<p>と書きます。</p>
<p>Python2.5、Django1.1.1でのお話でした。</p>

]]></content:encoded>
			<wfw:commentRss>http://tt-house.com/2010/07/django-self-relation.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DjangoでMySQLのストレージエンジンをInnoDBにする</title>
		<link>http://tt-house.com/2010/07/django-using-innodb.html</link>
		<comments>http://tt-house.com/2010/07/django-using-innodb.html#comments</comments>
		<pubDate>Tue, 27 Jul 2010 02:12:30 +0000</pubDate>
		<dc:creator>ハセテツ</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://tt-house.com/?p=324</guid>
		<description><![CDATA[DjangoでMySQLを利用する場合、初期状態だとMyISAMでテーブルが作成されます。まぁ後からalterすればよい話ではあるのですが、なんかそれだと違うかなぁと。 一昔前はInnoDBはMyISAMほどパフォーマンスが優れず、更新系のテーブルと参照系のテーブルでストレージエンジンを使い分けたものですが、今はストレージエンジンによるパフォーマンスの差も少ないため、行レベルロックができるInnoDBを積極的に採用するケースが増えてるみたいですね。まぁ数千万行をレコードから数ミリ秒でレスポンスを返さないといけないケースとかではどうなるのかわかりませんが。 DATABASE_OPTIONS = { &#8220;init_command&#8221;: &#8220;SET storage_engine=INNODB&#8221;, } settings.pyに上記を記載するだけでsyncdbするときにInnoDBでテーブル作成してくれます。が、この記述はテーブル作成が終わって運用にはいったら削除するように、とのことです。 MySQLとの接続が確立された後にわざわざストレージエンジンを指定するコマンドを送っているっぽいので、普段は無駄な処理が発生しちゃうっていうことなんですかね。]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Ftt-house.com%252F2010%252F07%252Fdjango-using-innodb.html%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2FcyuL5I%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Django%E3%81%A7MySQL%E3%81%AE%E3%82%B9%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B8%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%B3%E3%82%92InnoDB%E3%81%AB%E3%81%99%E3%82%8B%22%20%7D);"></div>
<p>DjangoでMySQLを利用する場合、初期状態だとMyISAMでテーブルが作成されます。まぁ後からalterすればよい話ではあるのですが、なんかそれだと違うかなぁと。</p>
<p>一昔前はInnoDBはMyISAMほどパフォーマンスが優れず、更新系のテーブルと参照系のテーブルでストレージエンジンを使い分けたものですが、今はストレージエンジンによるパフォーマンスの差も少ないため、行レベルロックができるInnoDBを積極的に採用するケースが増えてるみたいですね。まぁ数千万行をレコードから数ミリ秒でレスポンスを返さないといけないケースとかではどうなるのかわかりませんが。</p>
<blockquote>
<div id="_mcePaste">DATABASE_OPTIONS = {</div>
<div id="_mcePaste" style="padding-left: 30px;">&#8220;init_command&#8221;: &#8220;SET storage_engine=INNODB&#8221;,</div>
<div id="_mcePaste">}</div>
</blockquote>
<p>settings.pyに上記を記載するだけでsyncdbするときにInnoDBでテーブル作成してくれます。が、この記述はテーブル作成が終わって運用にはいったら削除するように、とのことです。</p>
<p>MySQLとの接続が確立された後にわざわざストレージエンジンを指定するコマンドを送っているっぽいので、普段は無駄な処理が発生しちゃうっていうことなんですかね。</p>

]]></content:encoded>
			<wfw:commentRss>http://tt-house.com/2010/07/django-using-innodb.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Djangoでテンプレート出力と同時にcookieを書き込む方法</title>
		<link>http://tt-house.com/2010/05/django-template-cookie.html</link>
		<comments>http://tt-house.com/2010/05/django-template-cookie.html#comments</comments>
		<pubDate>Wed, 19 May 2010 07:53:51 +0000</pubDate>
		<dc:creator>ハセテツ</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://tt-house.com/?p=292</guid>
		<description><![CDATA[Djangoでテンプレートを出力するとき、あわせてcookieの書き込みもしたいケースがあります。よくあるサンプルだと return render_to_response(&#8216;index.html&#8217;) っていう書き方をしているのですが、「コレ、cookieの書き出しどうすんのよ」って悩んでしまいました。その結果、 def  index(request): _max_age = 45*24*60*60 _expires = datetime.datetime.strftime(datetime.datetime.utcnow() + datetime.timedelta(seconds=_max_age), &#8220;%a, %d-%b-%Y %H:%M:%S GMT&#8221;) _response = render_to_response(&#8216;index.html&#8217;) _response.set_cookie(&#8216;hoge&#8217;, value=&#8217;hogehoge&#8217;, max_age=_max_age, expires=_expires, path=&#8217;/') return _response こんな書き方をしたらできているようでした。上記の例だと、現在時刻から45日間有効なcookieを書き出しています。 単純なことなんですが、意外と躓いてしまった。。。 Python2.5、Django1.1.1です。 そういえばDjangoの1.2がリリースされてますね。検証したいな。]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Ftt-house.com%252F2010%252F05%252Fdjango-template-cookie.html%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Django%E3%81%A7%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E5%87%BA%E5%8A%9B%E3%81%A8%E5%90%8C%E6%99%82%E3%81%ABcookie%E3%82%92%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%82%80%E6%96%B9%E6%B3%95%22%20%7D);"></div>
<p>Djangoでテンプレートを出力するとき、あわせてcookieの書き込みもしたいケースがあります。よくあるサンプルだと</p>
<blockquote><p>return render_to_response(&#8216;index.html&#8217;)</p></blockquote>
<p>っていう書き方をしているのですが、「コレ、cookieの書き出しどうすんのよ」って悩んでしまいました。その結果、</p>
<blockquote>
<div id="_mcePaste">def  index(request):</div>
<div id="_mcePaste" style="padding-left: 30px;">_max_age = 45*24*60*60</div>
<div id="_mcePaste" style="padding-left: 30px;">_expires = datetime.datetime.strftime(datetime.datetime.utcnow() + datetime.timedelta(seconds=_max_age), &#8220;%a, %d-%b-%Y %H:%M:%S GMT&#8221;)</div>
<div id="_mcePaste" style="padding-left: 30px;">_response = render_to_response(&#8216;index.html&#8217;)</div>
<div id="_mcePaste" style="padding-left: 30px;">_response.set_cookie(&#8216;hoge&#8217;, value=&#8217;hogehoge&#8217;, max_age=_max_age, expires=_expires, path=&#8217;/')</div>
<div id="_mcePaste" style="padding-left: 30px;">return _response</div>
</blockquote>
<p>こんな書き方をしたらできているようでした。上記の例だと、現在時刻から45日間有効なcookieを書き出しています。</p>
<p>単純なことなんですが、意外と躓いてしまった。。。</p>
<p>Python2.5、Django1.1.1です。</p>
<p>そういえばDjangoの1.2がリリースされてますね。検証したいな。</p>

]]></content:encoded>
			<wfw:commentRss>http://tt-house.com/2010/05/django-template-cookie.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RubyとPythonについて考えてみました</title>
		<link>http://tt-house.com/2010/04/think-about-ruby-python.html</link>
		<comments>http://tt-house.com/2010/04/think-about-ruby-python.html#comments</comments>
		<pubDate>Tue, 27 Apr 2010 05:28:06 +0000</pubDate>
		<dc:creator>ハセテツ</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[RubyOnRails]]></category>

		<guid isPermaLink="false">http://tt-house.com/?p=278</guid>
		<description><![CDATA[ハセテツは複数の言語を状況に応じて使い分けてきましたが、最近のWeb系開発はPython（+Django）がメインになってきています。

ちょっと前までRuby（+Rails）だったのですが、いろいろと考えるところもあり、乗り換えました。その乗り換えた理由をまとめてみようと思います。

まとめてみたら「やっぱりRailsじゃね？」となるかもしれません。ｗ]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Ftt-house.com%252F2010%252F04%252Fthink-about-ruby-python.html%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Ruby%E3%81%A8Python%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E8%80%83%E3%81%88%E3%81%A6%E3%81%BF%E3%81%BE%E3%81%97%E3%81%9F%22%20%7D);"></div>
<p>ハセテツは複数の言語を状況に応じて使い分けてきましたが、最近のWeb系開発はPython（+Django）がメインになってきています。</p>
<p>ちょっと前までRuby（+Rails）だったのですが、いろいろと考えるところもあり、乗り換えました。その乗り換えた理由をまとめてみようと思います。</p>
<p>まとめてみたら「やっぱりRailsじゃね？」となるかもしれません。ｗ</p>
<p>Ruby（+Rails）</p>
<ul>
<li>Rails便利すぎる。</li>
<li>コントローラとモデルが別々のファイルになってくれるのはソースが追いやすい。</li>
<li>Railsを通さない画像やCSSはpublicフォルダに置けばよいのはわかりやすい。</li>
<li>urlディスパッチャーがいまいち使いにくい。（知らないだけかも）</li>
<li>APサーバはmongrel一択？</li>
<li>VirtualHost使おうとするとApache+Passenger（mod_rails）だが、これが重い。（チューニングで速くなるのかも）</li>
<li>というか、Railsがそもそも重い。</li>
<li>ちゅーか、Rubyが重い、遅い。</li>
<li>PassengerはWindowsじゃ動かない。</li>
<li>mongrelもPassengerより激速軽快かというと、そうでもない。</li>
<li>gem便利すぎ。</li>
<li>ワンライナで書く人が多くて、Perlとおなじ匂いがする。</li>
</ul>
<p>ハセテツが使っていたRubyは1.8で、速くなったといわれる1.9には触れていないのでもしかすると古いのかもしれません。でも、Railsって1.9には対応してないですよね？（本日現在）</p>
<p>Python（+Django）</p>
<ul>
<li>Django便利すぎる。</li>
<li>日本語の書籍、情報が少なすぎる。（ハマるとキツい）</li>
<li>modelが一枚のファイルなので、大量のmodelがあると可読性が激しくダウン。</li>
<li>viewファイルをフォルダで分けたくても、アプリケーションフォルダ直下以外にviewファイル置くなら「sys.path.append」しないといけない。（違う？）</li>
<li>urlディスパッチャーのカスタマイズが超便利。</li>
<li>mod_pythonが使えるので、Windows環境だろうがLinux環境だろうが気にせずVirtualHostが使える。</li>
<li>速い。</li>
<li>日本語大変。Shift_JIS怖い。</li>
<li>easy_installでパッケージのインストールは楽だが、管理が悪夢。</li>
</ul>
<p>メリットとデメリットが入り乱れました。見難くてすいません。</p>
<p>結局フルスタックのフレームワークということで、DjangoとRailｓに関しては一長一短だと思います。個人的にはRailsの方が良くできてたかなぁと。</p>
<p>最終的に、「RubyonRailsは重い」というオチになってしまうのです。Rubyも、Railsも、です。ただ、これはRuby1.9が実は劇的に速くなっていて、1.9に対応したRailsがリリースされたらすべて解決されるのかもしれません。</p>
<p>それでも、いまのところPythonの軽快さ、シンプルさに満足しています。あと、GAEでPythonが動くのもいいですよね。</p>
<p>「Googleが導入した言語」というのがハセテツ的に琴線に触れたのかもしれません。</p>
<p>ミーハーですいません。ｗ</p>

]]></content:encoded>
			<wfw:commentRss>http://tt-house.com/2010/04/think-about-ruby-python.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Djangoでパスワード等の暗号化保存を隠蔽する</title>
		<link>http://tt-house.com/2010/04/django-model-save-override.html</link>
		<comments>http://tt-house.com/2010/04/django-model-save-override.html#comments</comments>
		<pubDate>Wed, 21 Apr 2010 10:47:01 +0000</pubDate>
		<dc:creator>ハセテツ</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://tt-house.com/?p=269</guid>
		<description><![CDATA[隠蔽するっていうか、viewにごりごり書くのではなくてModelのメソッドで処理してしまおうという話です。このエントリの応用ですね。 import hashlib class Member(models.Model): &#160;&#160;&#160;&#160;name = models.CharField(max_length=32) &#160;&#160;&#160;&#160;passwd = models.CharField(max_length=256) &#160;&#160;&#160;&#160;def save(self, force_insert=False, force_update=False): &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;self.passwd = hashlib.md5(self.passwd).hexdigest() &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;super(Member, self).save(force_insert, force_insert) Modelのsave()メソッドをオーバーライドしています。これで、登録フォームなどからPOSTされたデータをそのままsave()してもデータベース上には暗号化された状態で保存されます。 adminサイトで作成したユーザ情報なんかのパスワードとかも、暗号化して保存してくれます。便利便利。]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Ftt-house.com%252F2010%252F04%252Fdjango-model-save-override.html%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Django%E3%81%A7%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E7%AD%89%E3%81%AE%E6%9A%97%E5%8F%B7%E5%8C%96%E4%BF%9D%E5%AD%98%E3%82%92%E9%9A%A0%E8%94%BD%E3%81%99%E3%82%8B%22%20%7D);"></div>
<p>隠蔽するっていうか、viewにごりごり書くのではなくてModelのメソッドで処理してしまおうという話です。<a href="http://tt-house.com/2010/01/python-hash-md5.html" target="_blank">このエントリ</a>の応用ですね。</p>
<blockquote><p>import hashlib</p>
<div id="_mcePaste">class Member(models.Model):</div>
<div id="_mcePaste">&nbsp;&nbsp;&nbsp;&nbsp;name = models.CharField(max_length=32)</div>
<div id="_mcePaste">&nbsp;&nbsp;&nbsp;&nbsp;passwd = models.CharField(max_length=256)</div>
<div id="_mcePaste">&nbsp;&nbsp;&nbsp;&nbsp;def save(self, force_insert=False, force_update=False):</div>
<div id="_mcePaste">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.passwd = hashlib.md5(self.passwd).hexdigest()</div>
<div id="_mcePaste">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super(Member, self).save(force_insert, force_insert)</div>
</blockquote>
<div>Modelのsave()メソッドをオーバーライドしています。これで、登録フォームなどからPOSTされたデータをそのままsave()してもデータベース上には暗号化された状態で保存されます。</div>
<div>adminサイトで作成したユーザ情報なんかのパスワードとかも、暗号化して保存してくれます。便利便利。</div>

]]></content:encoded>
			<wfw:commentRss>http://tt-house.com/2010/04/django-model-save-override.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DjangoのフォームでChoiceFieldのchoicesを動的に指定する</title>
		<link>http://tt-house.com/2010/04/django-choicefield-choices.html</link>
		<comments>http://tt-house.com/2010/04/django-choicefield-choices.html#comments</comments>
		<pubDate>Tue, 20 Apr 2010 07:54:56 +0000</pubDate>
		<dc:creator>ハセテツ</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://tt-house.com/?p=263</guid>
		<description><![CDATA[コンボボックスの<option>～</option>の値は動的に指定したいものです。が、Djangoでどうしたらよいものか、数時間悩みました。]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Ftt-house.com%252F2010%252F04%252Fdjango-choicefield-choices.html%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Django%E3%81%AE%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%81%A7ChoiceField%E3%81%AEchoices%E3%82%92%E5%8B%95%E7%9A%84%E3%81%AB%E6%8C%87%E5%AE%9A%E3%81%99%E3%82%8B%22%20%7D);"></div>
<p>コンボボックスの&lt;option&gt;～&lt;/option&gt;の値は動的に指定したいものです。が、Djangoでどうしたらよいものか、数時間悩みました。</p>
<p>これが意外と簡単で、こんなことで数時間悩んだ自分が情けなく、それでも発見した自分をほめてやりたく。ｗ</p>
<blockquote>
<div id="_mcePaste">class Form_hoge(forms.Form):</div>
<div id="_mcePaste">&nbsp;&nbsp;&nbsp;&nbsp;month = forms.ChoiceField()</div>
<div id="_mcePaste">_form = Form_hoge()</div>
<div id="_mcePaste">_form.fields['month'].choices = [(1,1), (2,2), (3,3)]</div>
</blockquote>
<div>フォームを呼んだ後に指定するだけ。</div>
<div>なんですぐ気づかなかったんだろ。。。</div>
<div>Django1.1.1、Python2.5で動作検証。</div>

]]></content:encoded>
			<wfw:commentRss>http://tt-house.com/2010/04/django-choicefield-choices.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Djangoで集計クエリ（1.1以降でannotateを使用）</title>
		<link>http://tt-house.com/2010/04/django-query-annotate.html</link>
		<comments>http://tt-house.com/2010/04/django-query-annotate.html#comments</comments>
		<pubDate>Tue, 20 Apr 2010 04:29:29 +0000</pubDate>
		<dc:creator>ハセテツ</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://tt-house.com/?p=259</guid>
		<description><![CDATA[Djangoのモデルで集計クエリというと、1.0以降でcount()が使えますが、1.1になってさらに多機能になっていました。]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Ftt-house.com%252F2010%252F04%252Fdjango-query-annotate.html%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Django%E3%81%A7%E9%9B%86%E8%A8%88%E3%82%AF%E3%82%A8%E3%83%AA%EF%BC%881.1%E4%BB%A5%E9%99%8D%E3%81%A7annotate%E3%82%92%E4%BD%BF%E7%94%A8%EF%BC%89%22%20%7D);"></div>
<p>Djangoのモデルで集計クエリというと、1.0以降でcount()が使えますが、1.1になってさらに多機能になっていました。</p>
<blockquote><p>from django.db.models import Sum</p>
<div id="_mcePaste">_result = Detail.objects.all().values(&#8216;category&#8217;).annotate(price=Sum(&#8216;price&#8217;))</div>
<div id="_mcePaste">for item in _result:</div>
<p>&nbsp;&nbsp;&nbsp;&nbsp;print item</p></blockquote>
<p>Detailというモデルがあって、それをcategoryというフィールドでグループ化し、priceというフィールドのsum（合計）を求めています。</p>
<p>values(～)は必須ではありません。グループ化しないと全体のsumですね。</p>
<blockquote><p>annotate(得られる結果の名前=Sum(集計対象フィールド))</p></blockquote>
<p>です。サンプルの「price」をsum_priceにしても結果は得られます。</p>
<p>また、annotateで利用できるのはsumだけでなく、Avg、Max、Min、Countも使用できます。サンプルコードだとSumしかインポートしていませんが、「*」でまとめてインポートするか、「Avg, Max, Min, Sum, Count」をそれぞれインポートしてあげれば使用できます。</p>
<p>ちなみに、サンプルコードで得られるitemは、Detailモデルのインスタンスではありません。辞書です。最初ここに気づかず、「？」となっていました。ｗ</p>

]]></content:encoded>
			<wfw:commentRss>http://tt-house.com/2010/04/django-query-annotate.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>DjangoのフォームでCSSのclassを指定する</title>
		<link>http://tt-house.com/2010/04/django-forms-css-class.html</link>
		<comments>http://tt-house.com/2010/04/django-forms-css-class.html#comments</comments>
		<pubDate>Tue, 06 Apr 2010 04:46:40 +0000</pubDate>
		<dc:creator>ハセテツ</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://tt-house.com/?p=243</guid>
		<description><![CDATA[Djangoのフォームでclassを指定する方法です。Widgetクラスを使うのですが、情報が少ないような気がします。探し方ヘタ？ class Form_login(forms.Form): &#160;&#160;&#160;&#160;mailadd = forms.EmailField(max_length=32,widget=forms.TextInput(attrs={&#8216;class&#8217;:'form_entry&#8217;})) &#160;&#160;&#160;&#160;passwd = forms.CharField(min_length=6, max_length=12,widget=forms.PasswordInput(render_value=False)) これで出力されるフォームには「class=&#8221;form_entry&#8221;」が追加されます。 パスワード側もWidgetクラスを使用していますが、Widgetクラスを活用するとDjangoのフォームってものすごく便利に活用できるような気がします。 Django 1.1.1、Python2.5で検証しました。]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Ftt-house.com%252F2010%252F04%252Fdjango-forms-css-class.html%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Django%E3%81%AE%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%81%A7CSS%E3%81%AEclass%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%99%E3%82%8B%22%20%7D);"></div>
<p>Djangoのフォームでclassを指定する方法です。Widgetクラスを使うのですが、情報が少ないような気がします。探し方ヘタ？</p>
<div id="_mcePaste">
<blockquote>
<div id="_mcePaste">class Form_login(forms.Form):</div>
<div id="_mcePaste">&nbsp;&nbsp;&nbsp;&nbsp;mailadd = forms.EmailField(max_length=32,widget=forms.TextInput(attrs={&#8216;class&#8217;:'form_entry&#8217;}))</div>
<div id="_mcePaste">&nbsp;&nbsp;&nbsp;&nbsp;passwd = forms.CharField(min_length=6, max_length=12,widget=forms.PasswordInput(render_value=False))</div>
</blockquote>
<div>
<p>これで出力されるフォームには「class=&#8221;form_entry&#8221;」が追加されます。</p>
<p>パスワード側もWidgetクラスを使用していますが、Widgetクラスを活用するとDjangoのフォームってものすごく便利に活用できるような気がします。</p>
<p>Django 1.1.1、Python2.5で検証しました。</p>
</div>
</div>

]]></content:encoded>
			<wfw:commentRss>http://tt-house.com/2010/04/django-forms-css-class.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Djangoで環境変数を取得する方法</title>
		<link>http://tt-house.com/2010/03/django-get-serverinfo.html</link>
		<comments>http://tt-house.com/2010/03/django-get-serverinfo.html#comments</comments>
		<pubDate>Fri, 26 Mar 2010 08:56:24 +0000</pubDate>
		<dc:creator>ハセテツ</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://tt-house.com/?p=241</guid>
		<description><![CDATA[PHPでいうところの$_SERVERですね。 request.META.get(&#8216;HTTP_HOST&#8217;) ホスト名はこんな感じです。リファとかユーザーエージェント（ブラウザ）もここで。モバイルの場合端末識別番号も取得できますね。]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Ftt-house.com%252F2010%252F03%252Fdjango-get-serverinfo.html%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Django%E3%81%A7%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%22%20%7D);"></div>
<p>PHPでいうところの$_SERVERですね。</p>
<blockquote><p>request.META.get(&#8216;HTTP_HOST&#8217;)</p></blockquote>
<p>ホスト名はこんな感じです。リファとかユーザーエージェント（ブラウザ）もここで。モバイルの場合端末識別番号も取得できますね。</p>

]]></content:encoded>
			<wfw:commentRss>http://tt-house.com/2010/03/django-get-serverinfo.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
